@portel/photon 1.9.0 → 1.10.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 +163 -210
- package/dist/async/dedup-map.d.ts +40 -0
- package/dist/async/dedup-map.d.ts.map +1 -0
- package/dist/async/dedup-map.js +80 -0
- package/dist/async/dedup-map.js.map +1 -0
- package/dist/async/index.d.ts +11 -0
- package/dist/async/index.d.ts.map +1 -0
- package/dist/async/index.js +11 -0
- package/dist/async/index.js.map +1 -0
- package/dist/async/loading-gate.d.ts +27 -0
- package/dist/async/loading-gate.d.ts.map +1 -0
- package/dist/async/loading-gate.js +48 -0
- package/dist/async/loading-gate.js.map +1 -0
- package/dist/async/with-timeout.d.ts +6 -0
- package/dist/async/with-timeout.d.ts.map +1 -0
- package/dist/async/with-timeout.js +17 -0
- package/dist/async/with-timeout.js.map +1 -0
- package/dist/auto-ui/beam/class-metadata.d.ts +52 -0
- package/dist/auto-ui/beam/class-metadata.d.ts.map +1 -0
- package/dist/auto-ui/beam/class-metadata.js +133 -0
- package/dist/auto-ui/beam/class-metadata.js.map +1 -0
- package/dist/auto-ui/beam/config.d.ts +13 -0
- package/dist/auto-ui/beam/config.d.ts.map +1 -0
- package/dist/auto-ui/beam/config.js +52 -0
- package/dist/auto-ui/beam/config.js.map +1 -0
- package/dist/auto-ui/beam/external-mcp.d.ts +37 -0
- package/dist/auto-ui/beam/external-mcp.d.ts.map +1 -0
- package/dist/auto-ui/beam/external-mcp.js +311 -0
- package/dist/auto-ui/beam/external-mcp.js.map +1 -0
- package/dist/auto-ui/beam/photon-management.d.ts +51 -0
- package/dist/auto-ui/beam/photon-management.d.ts.map +1 -0
- package/dist/auto-ui/beam/photon-management.js +310 -0
- package/dist/auto-ui/beam/photon-management.js.map +1 -0
- package/dist/auto-ui/beam/routes/api-browse.d.ts +17 -0
- package/dist/auto-ui/beam/routes/api-browse.d.ts.map +1 -0
- package/dist/auto-ui/beam/routes/api-browse.js +531 -0
- package/dist/auto-ui/beam/routes/api-browse.js.map +1 -0
- package/dist/auto-ui/beam/routes/api-config.d.ts +9 -0
- package/dist/auto-ui/beam/routes/api-config.d.ts.map +1 -0
- package/dist/auto-ui/beam/routes/api-config.js +494 -0
- package/dist/auto-ui/beam/routes/api-config.js.map +1 -0
- package/dist/auto-ui/beam/routes/api-marketplace.d.ts +8 -0
- package/dist/auto-ui/beam/routes/api-marketplace.d.ts.map +1 -0
- package/dist/auto-ui/beam/routes/api-marketplace.js +490 -0
- package/dist/auto-ui/beam/routes/api-marketplace.js.map +1 -0
- package/dist/auto-ui/beam/startup.d.ts +41 -0
- package/dist/auto-ui/beam/startup.d.ts.map +1 -0
- package/dist/auto-ui/beam/startup.js +98 -0
- package/dist/auto-ui/beam/startup.js.map +1 -0
- package/dist/auto-ui/beam/subscription.d.ts +35 -0
- package/dist/auto-ui/beam/subscription.d.ts.map +1 -0
- package/dist/auto-ui/beam/subscription.js +151 -0
- package/dist/auto-ui/beam/subscription.js.map +1 -0
- package/dist/auto-ui/beam/types.d.ts +103 -0
- package/dist/auto-ui/beam/types.d.ts.map +1 -0
- package/dist/auto-ui/beam/types.js +8 -0
- package/dist/auto-ui/beam/types.js.map +1 -0
- package/dist/auto-ui/beam.d.ts +2 -0
- package/dist/auto-ui/beam.d.ts.map +1 -1
- package/dist/auto-ui/beam.js +729 -2596
- package/dist/auto-ui/beam.js.map +1 -1
- package/dist/auto-ui/bridge/index.d.ts.map +1 -1
- package/dist/auto-ui/bridge/index.js +10 -2
- package/dist/auto-ui/bridge/index.js.map +1 -1
- package/dist/auto-ui/components/card.d.ts.map +1 -1
- package/dist/auto-ui/components/card.js +3 -1
- package/dist/auto-ui/components/card.js.map +1 -1
- package/dist/auto-ui/components/progress.d.ts.map +1 -1
- package/dist/auto-ui/components/progress.js.map +1 -1
- package/dist/auto-ui/daemon-tools.d.ts +1 -1
- package/dist/auto-ui/daemon-tools.d.ts.map +1 -1
- package/dist/auto-ui/daemon-tools.js +4 -3
- package/dist/auto-ui/daemon-tools.js.map +1 -1
- package/dist/auto-ui/photon-bridge.d.ts +6 -2
- package/dist/auto-ui/photon-bridge.d.ts.map +1 -1
- package/dist/auto-ui/photon-bridge.js +20 -8
- package/dist/auto-ui/photon-bridge.js.map +1 -1
- package/dist/auto-ui/platform-compat.d.ts.map +1 -1
- package/dist/auto-ui/platform-compat.js +4 -0
- package/dist/auto-ui/platform-compat.js.map +1 -1
- package/dist/auto-ui/streamable-http-transport.d.ts +4 -2
- package/dist/auto-ui/streamable-http-transport.d.ts.map +1 -1
- package/dist/auto-ui/streamable-http-transport.js +120 -30
- package/dist/auto-ui/streamable-http-transport.js.map +1 -1
- package/dist/auto-ui/types.d.ts +4 -2
- package/dist/auto-ui/types.d.ts.map +1 -1
- package/dist/auto-ui/types.js.map +1 -1
- package/dist/beam.bundle.js +8225 -3999
- package/dist/beam.bundle.js.map +4 -4
- package/dist/cli/commands/alias.d.ts +14 -0
- package/dist/cli/commands/alias.d.ts.map +1 -0
- package/dist/cli/commands/alias.js +41 -0
- package/dist/cli/commands/alias.js.map +1 -0
- package/dist/cli/commands/audit.d.ts +9 -0
- package/dist/cli/commands/audit.d.ts.map +1 -0
- package/dist/cli/commands/audit.js +377 -0
- package/dist/cli/commands/audit.js.map +1 -0
- package/dist/cli/commands/beam.d.ts +20 -0
- package/dist/cli/commands/beam.d.ts.map +1 -0
- package/dist/cli/commands/beam.js +256 -0
- package/dist/cli/commands/beam.js.map +1 -0
- package/dist/cli/commands/config.d.ts +14 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +165 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/daemon.d.ts +11 -0
- package/dist/cli/commands/daemon.d.ts.map +1 -0
- package/dist/cli/commands/daemon.js +108 -0
- package/dist/cli/commands/daemon.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +14 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +257 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/host.d.ts +11 -0
- package/dist/cli/commands/host.d.ts.map +1 -0
- package/dist/cli/commands/host.js +96 -0
- package/dist/cli/commands/host.js.map +1 -0
- package/dist/cli/commands/info.d.ts +1 -1
- package/dist/cli/commands/info.d.ts.map +1 -1
- package/dist/cli/commands/info.js +16 -15
- package/dist/cli/commands/info.js.map +1 -1
- package/dist/cli/commands/init.d.ts +20 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +774 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/maker.d.ts +12 -0
- package/dist/cli/commands/maker.d.ts.map +1 -0
- package/dist/cli/commands/maker.js +605 -0
- package/dist/cli/commands/maker.js.map +1 -0
- package/dist/cli/commands/mcp.d.ts +27 -0
- package/dist/cli/commands/mcp.d.ts.map +1 -0
- package/dist/cli/commands/mcp.js +390 -0
- package/dist/cli/commands/mcp.js.map +1 -0
- package/dist/cli/commands/package-app.d.ts +1 -1
- package/dist/cli/commands/package-app.d.ts.map +1 -1
- package/dist/cli/commands/package-app.js +5 -4
- package/dist/cli/commands/package-app.js.map +1 -1
- package/dist/cli/commands/package.d.ts +1 -1
- package/dist/cli/commands/package.d.ts.map +1 -1
- package/dist/cli/commands/package.js +134 -32
- package/dist/cli/commands/package.js.map +1 -1
- package/dist/cli/commands/run.d.ts +34 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +334 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/search.d.ts +11 -0
- package/dist/cli/commands/search.d.ts.map +1 -0
- package/dist/cli/commands/search.js +60 -0
- package/dist/cli/commands/search.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +11 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +138 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/test.d.ts +14 -0
- package/dist/cli/commands/test.d.ts.map +1 -0
- package/dist/cli/commands/test.js +51 -0
- package/dist/cli/commands/test.js.map +1 -0
- package/dist/cli/commands/update.d.ts +11 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/commands/update.js +72 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/index.d.ts +14 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +139 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli-alias.js +2 -2
- package/dist/cli-alias.js.map +1 -1
- package/dist/cli.d.ts +3 -16
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +4 -2725
- package/dist/cli.js.map +1 -1
- package/dist/context-store.d.ts +13 -12
- package/dist/context-store.d.ts.map +1 -1
- package/dist/context-store.js +47 -23
- package/dist/context-store.js.map +1 -1
- package/dist/context.d.ts +35 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +38 -0
- package/dist/context.js.map +1 -0
- package/dist/daemon/client.d.ts +25 -13
- package/dist/daemon/client.d.ts.map +1 -1
- package/dist/daemon/client.js +183 -135
- package/dist/daemon/client.js.map +1 -1
- package/dist/daemon/manager.d.ts +58 -26
- package/dist/daemon/manager.d.ts.map +1 -1
- package/dist/daemon/manager.js +348 -157
- package/dist/daemon/manager.js.map +1 -1
- package/dist/daemon/protocol.d.ts +9 -3
- package/dist/daemon/protocol.d.ts.map +1 -1
- package/dist/daemon/protocol.js +2 -0
- package/dist/daemon/protocol.js.map +1 -1
- package/dist/daemon/server.js +850 -200
- package/dist/daemon/server.js.map +1 -1
- package/dist/daemon/session-manager.d.ts +16 -2
- package/dist/daemon/session-manager.d.ts.map +1 -1
- package/dist/daemon/session-manager.js +65 -7
- package/dist/daemon/session-manager.js.map +1 -1
- package/dist/daemon/state-machine.d.ts +22 -0
- package/dist/daemon/state-machine.d.ts.map +1 -0
- package/dist/daemon/state-machine.js +48 -0
- package/dist/daemon/state-machine.js.map +1 -0
- package/dist/deploy/cloudflare.d.ts.map +1 -1
- package/dist/deploy/cloudflare.js +5 -5
- package/dist/deploy/cloudflare.js.map +1 -1
- package/dist/loader.d.ts +65 -7
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +587 -63
- package/dist/loader.js.map +1 -1
- package/dist/marketplace-manager.d.ts +84 -12
- package/dist/marketplace-manager.d.ts.map +1 -1
- package/dist/marketplace-manager.js +470 -26
- package/dist/marketplace-manager.js.map +1 -1
- package/dist/path-resolver.d.ts +3 -1
- package/dist/path-resolver.d.ts.map +1 -1
- package/dist/path-resolver.js +4 -3
- package/dist/path-resolver.js.map +1 -1
- package/dist/photon-cli-runner.d.ts +1 -1
- package/dist/photon-cli-runner.d.ts.map +1 -1
- package/dist/photon-cli-runner.js +34 -44
- package/dist/photon-cli-runner.js.map +1 -1
- package/dist/photon-doc-extractor.d.ts +1 -0
- package/dist/photon-doc-extractor.d.ts.map +1 -1
- package/dist/photon-doc-extractor.js +33 -12
- package/dist/photon-doc-extractor.js.map +1 -1
- package/dist/photons/maker.photon.d.ts.map +1 -1
- package/dist/photons/maker.photon.js +4 -4
- package/dist/photons/maker.photon.js.map +1 -1
- package/dist/photons/maker.photon.ts +4 -3
- package/dist/photons/marketplace.photon.d.ts.map +1 -1
- package/dist/photons/marketplace.photon.js +10 -27
- package/dist/photons/marketplace.photon.js.map +1 -1
- package/dist/photons/marketplace.photon.ts +14 -33
- package/dist/photons/tunnel.photon.d.ts.map +1 -1
- package/dist/photons/tunnel.photon.js +4 -8
- package/dist/photons/tunnel.photon.js.map +1 -1
- package/dist/photons/tunnel.photon.ts +4 -7
- package/dist/serv/session/kv-store.d.ts +1 -1
- package/dist/serv/session/kv-store.d.ts.map +1 -1
- package/dist/serv/session/store.d.ts.map +1 -1
- package/dist/serv/session/store.js +16 -14
- package/dist/serv/session/store.js.map +1 -1
- package/dist/serv/vault/token-vault.js +1 -1
- package/dist/serv/vault/token-vault.js.map +1 -1
- package/dist/server.d.ts +34 -12
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +364 -313
- package/dist/server.js.map +1 -1
- package/dist/shared/audit.d.ts +30 -0
- package/dist/shared/audit.d.ts.map +1 -0
- package/dist/shared/audit.js +89 -0
- package/dist/shared/audit.js.map +1 -0
- package/dist/shared/cli-sections.d.ts +0 -4
- package/dist/shared/cli-sections.d.ts.map +1 -1
- package/dist/shared/cli-sections.js +0 -6
- package/dist/shared/cli-sections.js.map +1 -1
- package/dist/shared/cli-utils.d.ts +2 -56
- package/dist/shared/cli-utils.d.ts.map +1 -1
- package/dist/shared/cli-utils.js +1 -87
- package/dist/shared/cli-utils.js.map +1 -1
- package/dist/shared/error-handler.d.ts +6 -72
- package/dist/shared/error-handler.d.ts.map +1 -1
- package/dist/shared/error-handler.js +22 -213
- package/dist/shared/error-handler.js.map +1 -1
- package/dist/shared/security.d.ts +0 -9
- package/dist/shared/security.d.ts.map +1 -1
- package/dist/shared/security.js +0 -30
- package/dist/shared/security.js.map +1 -1
- package/dist/shared-utils.d.ts +0 -26
- package/dist/shared-utils.d.ts.map +1 -1
- package/dist/shared-utils.js +0 -44
- package/dist/shared-utils.js.map +1 -1
- package/dist/shell-completions.d.ts +1 -1
- package/dist/shell-completions.d.ts.map +1 -1
- package/dist/shell-completions.js +5 -5
- package/dist/shell-completions.js.map +1 -1
- package/dist/template-manager.d.ts.map +1 -1
- package/dist/template-manager.js +14 -1
- package/dist/template-manager.js.map +1 -1
- package/dist/test-runner.d.ts +0 -12
- package/dist/test-runner.d.ts.map +1 -1
- package/dist/test-runner.js +4 -39
- package/dist/test-runner.js.map +1 -1
- package/dist/testing.d.ts +1 -1
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +2 -2
- package/dist/testing.js.map +1 -1
- package/dist/version-checker.d.ts +4 -4
- package/dist/version-checker.d.ts.map +1 -1
- package/dist/version-checker.js +33 -4
- package/dist/version-checker.js.map +1 -1
- package/dist/watcher.d.ts.map +1 -1
- package/dist/watcher.js +14 -12
- package/dist/watcher.js.map +1 -1
- package/package.json +24 -17
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Beam & SSE CLI Commands
|
|
3
|
+
*
|
|
4
|
+
* beam: Launch Photon Beam interactive control panel
|
|
5
|
+
* sse: Run Photon as HTTP server with SSE transport
|
|
6
|
+
*/
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
import * as net from 'net';
|
|
9
|
+
import { getErrorMessage, ExitCode, exitWithError, handleError, } from '../../shared/error-handler.js';
|
|
10
|
+
import { normalizeLogLevel, logger } from '../../shared/logger.js';
|
|
11
|
+
import { validateOrThrow, inRange, isPositive, isInteger } from '../../shared/validation.js';
|
|
12
|
+
import { resolvePhotonPath } from '../../path-resolver.js';
|
|
13
|
+
import { getDefaultContext } from '../../context.js';
|
|
14
|
+
import { getBundledPhotonPath } from '../../shared-utils.js';
|
|
15
|
+
import { fileURLToPath } from 'url';
|
|
16
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
17
|
+
// ══════════════════════════════════════════════════════════════════════════════
|
|
18
|
+
// PRIVATE HELPERS
|
|
19
|
+
// ══════════════════════════════════════════════════════════════════════════════
|
|
20
|
+
/**
|
|
21
|
+
* Check if a port is available
|
|
22
|
+
*/
|
|
23
|
+
function isPortAvailable(port) {
|
|
24
|
+
return new Promise((resolve) => {
|
|
25
|
+
const server = net.createServer();
|
|
26
|
+
server.once('error', () => resolve(false));
|
|
27
|
+
server.once('listening', () => {
|
|
28
|
+
server.close();
|
|
29
|
+
resolve(true);
|
|
30
|
+
});
|
|
31
|
+
// Listen on all interfaces (same as http.createServer default)
|
|
32
|
+
server.listen(port);
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Find an available port starting from the given port
|
|
37
|
+
*/
|
|
38
|
+
async function findAvailablePort(startPort, maxAttempts = 10) {
|
|
39
|
+
// Validate port range
|
|
40
|
+
validateOrThrow(startPort, [
|
|
41
|
+
inRange('start port', 1, 65535),
|
|
42
|
+
isInteger('start port'),
|
|
43
|
+
isPositive('start port'),
|
|
44
|
+
]);
|
|
45
|
+
for (let i = 0; i < maxAttempts; i++) {
|
|
46
|
+
const port = startPort + i;
|
|
47
|
+
if (port > 65535) {
|
|
48
|
+
throw new Error(`Port ${port} exceeds maximum port number (65535)`);
|
|
49
|
+
}
|
|
50
|
+
if (await isPortAvailable(port)) {
|
|
51
|
+
return port;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
throw new Error(`No available port found between ${startPort} and ${startPort + maxAttempts - 1}`);
|
|
55
|
+
}
|
|
56
|
+
function getLogOptionsFromCommand(command) {
|
|
57
|
+
const root = command?.parent?.opts?.() ?? {};
|
|
58
|
+
try {
|
|
59
|
+
const level = normalizeLogLevel(root.logLevel);
|
|
60
|
+
return {
|
|
61
|
+
level,
|
|
62
|
+
json: Boolean(root.jsonLogs),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
handleError(error, { exitOnError: true });
|
|
67
|
+
throw error; // TypeScript doesn't know handleError exits
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Resolve photon path - checks bundled first, then user directory
|
|
72
|
+
*/
|
|
73
|
+
async function resolvePhotonPathWithBundled(name, workingDir) {
|
|
74
|
+
// Check bundled photons first
|
|
75
|
+
const bundledPath = getBundledPhotonPath(name, __dirname);
|
|
76
|
+
if (bundledPath) {
|
|
77
|
+
return bundledPath;
|
|
78
|
+
}
|
|
79
|
+
// Fall back to user photons
|
|
80
|
+
return resolvePhotonPath(name, workingDir);
|
|
81
|
+
}
|
|
82
|
+
// ══════════════════════════════════════════════════════════════════════════════
|
|
83
|
+
// COMMANDS
|
|
84
|
+
// ══════════════════════════════════════════════════════════════════════════════
|
|
85
|
+
/**
|
|
86
|
+
* Register the sse command
|
|
87
|
+
*
|
|
88
|
+
* Run Photon as HTTP server with SSE transport (auto port detection)
|
|
89
|
+
*/
|
|
90
|
+
export function registerSSECommand(program) {
|
|
91
|
+
program
|
|
92
|
+
.command('sse', { hidden: true })
|
|
93
|
+
.argument('<name>', 'Photon name (without .photon.ts extension)')
|
|
94
|
+
.option('-p, --port <number>', 'Port to start from (auto-finds available)', '3000')
|
|
95
|
+
.option('--dev', 'Enable development mode with hot reload')
|
|
96
|
+
.description('Run Photon as HTTP server with SSE transport (auto port detection)')
|
|
97
|
+
.action(async (name, options, command) => {
|
|
98
|
+
try {
|
|
99
|
+
// Get working directory from global options
|
|
100
|
+
const workingDir = getDefaultContext().baseDir;
|
|
101
|
+
const logOptions = getLogOptionsFromCommand(command);
|
|
102
|
+
// Resolve file path from name
|
|
103
|
+
const filePath = await resolvePhotonPathWithBundled(name, workingDir);
|
|
104
|
+
if (!filePath) {
|
|
105
|
+
exitWithError(`Photon not found: ${name}`, {
|
|
106
|
+
exitCode: ExitCode.NOT_FOUND,
|
|
107
|
+
searchedIn: workingDir,
|
|
108
|
+
suggestion: "Use 'photon info' to see available photons",
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
// Find available port
|
|
112
|
+
const startPort = parseInt(options.port, 10);
|
|
113
|
+
const port = await findAvailablePort(startPort);
|
|
114
|
+
if (port !== startPort) {
|
|
115
|
+
console.error(`⚠️ Port ${startPort} is in use, using ${port} instead\n`);
|
|
116
|
+
}
|
|
117
|
+
const { PhotonServer } = await import('../../server.js');
|
|
118
|
+
const { FileWatcher } = await import('../../watcher.js');
|
|
119
|
+
// Start SSE server
|
|
120
|
+
const server = new PhotonServer({
|
|
121
|
+
filePath: filePath,
|
|
122
|
+
devMode: options.dev,
|
|
123
|
+
transport: 'sse',
|
|
124
|
+
port,
|
|
125
|
+
logOptions: { ...logOptions, scope: 'sse' },
|
|
126
|
+
workingDir,
|
|
127
|
+
});
|
|
128
|
+
// Handle shutdown signals
|
|
129
|
+
const shutdown = async () => {
|
|
130
|
+
console.error('\nShutting down...');
|
|
131
|
+
await server.stop();
|
|
132
|
+
process.exit(0);
|
|
133
|
+
};
|
|
134
|
+
process.on('SIGINT', () => {
|
|
135
|
+
void shutdown();
|
|
136
|
+
});
|
|
137
|
+
process.on('SIGTERM', () => {
|
|
138
|
+
void shutdown();
|
|
139
|
+
});
|
|
140
|
+
// Start the server
|
|
141
|
+
await server.start();
|
|
142
|
+
// Start file watcher in dev mode
|
|
143
|
+
if (options.dev) {
|
|
144
|
+
const watcher = new FileWatcher(server, filePath, server.createScopedLogger('watcher'));
|
|
145
|
+
watcher.start();
|
|
146
|
+
process.on('SIGINT', () => {
|
|
147
|
+
void watcher.stop();
|
|
148
|
+
});
|
|
149
|
+
process.on('SIGTERM', () => {
|
|
150
|
+
void watcher.stop();
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
logger.error(`Error: ${getErrorMessage(error)}`);
|
|
156
|
+
process.exit(1);
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Register the beam command
|
|
162
|
+
*
|
|
163
|
+
* Launch Photon Beam - interactive control panel for all your photons
|
|
164
|
+
*/
|
|
165
|
+
export function registerBeamCommand(program) {
|
|
166
|
+
program
|
|
167
|
+
.command('beam', { hidden: true })
|
|
168
|
+
.argument('[photon]', 'Photon to open in full-width focus view')
|
|
169
|
+
.option('-p, --port <number>', 'Port to start from (auto-finds available)', '3000')
|
|
170
|
+
.option('-o, --open', 'Auto-open browser after starting')
|
|
171
|
+
.option('--no-open', 'Do not auto-open browser')
|
|
172
|
+
.description('Launch Photon Beam - interactive control panel for all your photons')
|
|
173
|
+
.action(async (photon, options, command) => {
|
|
174
|
+
try {
|
|
175
|
+
const workingDir = getDefaultContext().baseDir;
|
|
176
|
+
const { existsSync } = await import('fs');
|
|
177
|
+
// If a photon name is given but not installed, try marketplace auto-install
|
|
178
|
+
if (photon) {
|
|
179
|
+
const photonFile = path.join(workingDir, `${photon}.photon.ts`);
|
|
180
|
+
if (!existsSync(photonFile)) {
|
|
181
|
+
const { MarketplaceManager } = await import('../../marketplace-manager.js');
|
|
182
|
+
const manager = new MarketplaceManager(undefined, workingDir);
|
|
183
|
+
await manager.initialize();
|
|
184
|
+
const conflict = await manager.checkConflict(photon);
|
|
185
|
+
if (conflict.sources.length === 0) {
|
|
186
|
+
const { printError } = await import('../../cli-formatter.js');
|
|
187
|
+
printError(`Photon '${photon}' not found locally or in marketplace.`);
|
|
188
|
+
console.error(` Search for it with: photon search ${photon}`);
|
|
189
|
+
process.exit(1);
|
|
190
|
+
}
|
|
191
|
+
console.error(`📦 Installing ${photon}...`);
|
|
192
|
+
const result = await manager.fetchMCP(photon);
|
|
193
|
+
if (result) {
|
|
194
|
+
await manager.installPhoton(result, photon, workingDir);
|
|
195
|
+
console.error(`✅ Installed ${photon}`);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
// Find available port
|
|
200
|
+
const startPort = parseInt(options.port, 10);
|
|
201
|
+
const port = await findAvailablePort(startPort);
|
|
202
|
+
if (port !== startPort) {
|
|
203
|
+
console.error(`⚠️ Port ${startPort} is in use, using ${port} instead\n`);
|
|
204
|
+
}
|
|
205
|
+
// Import and start Beam server
|
|
206
|
+
const { startBeam } = await import('../../auto-ui/beam.js');
|
|
207
|
+
await startBeam(workingDir, port);
|
|
208
|
+
// Auto-open browser — always when a photon is specified (focus mode), or when --open flag is set
|
|
209
|
+
if (photon || options.open) {
|
|
210
|
+
const actualPort = process.env.BEAM_PORT || port;
|
|
211
|
+
// Focus mode: hash routes to the photon, ?focus=1 hides sidebar for full-width view
|
|
212
|
+
const url = photon
|
|
213
|
+
? `http://localhost:${actualPort}/#${photon}?focus=1`
|
|
214
|
+
: `http://localhost:${actualPort}`;
|
|
215
|
+
const { exec } = await import('child_process');
|
|
216
|
+
const openCmd = process.platform === 'darwin'
|
|
217
|
+
? 'open'
|
|
218
|
+
: process.platform === 'win32'
|
|
219
|
+
? 'start'
|
|
220
|
+
: 'xdg-open';
|
|
221
|
+
exec(`${openCmd} "${url}"`, (err) => {
|
|
222
|
+
if (err)
|
|
223
|
+
logger.debug(`Could not auto-open browser: ${err.message}`);
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
// Handle shutdown signals (guard against duplicate Ctrl+C)
|
|
227
|
+
let shuttingDown = false;
|
|
228
|
+
const shutdown = async () => {
|
|
229
|
+
if (shuttingDown)
|
|
230
|
+
return;
|
|
231
|
+
shuttingDown = true;
|
|
232
|
+
console.error('\nShutting down Photon Beam...');
|
|
233
|
+
// Gracefully close external MCP clients to prevent ugly tracebacks
|
|
234
|
+
try {
|
|
235
|
+
const { stopBeam } = await import('../../auto-ui/beam.js');
|
|
236
|
+
await stopBeam();
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
// Ignore cleanup errors
|
|
240
|
+
}
|
|
241
|
+
process.exit(0);
|
|
242
|
+
};
|
|
243
|
+
process.on('SIGINT', () => {
|
|
244
|
+
void shutdown();
|
|
245
|
+
});
|
|
246
|
+
process.on('SIGTERM', () => {
|
|
247
|
+
void shutdown();
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
catch (error) {
|
|
251
|
+
logger.error(`Error: ${getErrorMessage(error)}`);
|
|
252
|
+
process.exit(1);
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=beam.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"beam.js","sourceRoot":"","sources":["../../../src/cli/commands/beam.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config CLI Commands
|
|
3
|
+
*
|
|
4
|
+
* Commands for managing photon instances and environment configuration:
|
|
5
|
+
* - use: Switch to a named instance of a stateful photon
|
|
6
|
+
* - instances: List all instances of a stateful photon
|
|
7
|
+
* - set: Configure environment variables for a photon
|
|
8
|
+
*/
|
|
9
|
+
import type { Command } from 'commander';
|
|
10
|
+
/**
|
|
11
|
+
* Register config-related commands: use, instances, set
|
|
12
|
+
*/
|
|
13
|
+
export declare function registerConfigCommands(program: Command): void;
|
|
14
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuK7D"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config CLI Commands
|
|
3
|
+
*
|
|
4
|
+
* Commands for managing photon instances and environment configuration:
|
|
5
|
+
* - use: Switch to a named instance of a stateful photon
|
|
6
|
+
* - instances: List all instances of a stateful photon
|
|
7
|
+
* - set: Configure environment variables for a photon
|
|
8
|
+
*/
|
|
9
|
+
import { getErrorMessage } from '../../shared/error-handler.js';
|
|
10
|
+
import { getDefaultContext } from '../../context.js';
|
|
11
|
+
/**
|
|
12
|
+
* Register config-related commands: use, instances, set
|
|
13
|
+
*/
|
|
14
|
+
export function registerConfigCommands(program) {
|
|
15
|
+
// Use command: switch to a named instance of a stateful photon
|
|
16
|
+
program
|
|
17
|
+
.command('use')
|
|
18
|
+
.argument('<photon>', 'Photon name')
|
|
19
|
+
.argument('[instance]', 'Instance name (omit for default)')
|
|
20
|
+
.description('Switch to a named instance of a stateful photon')
|
|
21
|
+
.action(async (photonName, instance) => {
|
|
22
|
+
try {
|
|
23
|
+
const { printSuccess, printError } = await import('../../cli-formatter.js');
|
|
24
|
+
const { CLISessionStore } = await import('../../context-store.js');
|
|
25
|
+
// Write to CLI session store only — each client manages its own instance
|
|
26
|
+
new CLISessionStore().setCurrentInstance(photonName, instance || '');
|
|
27
|
+
const label = instance || 'default';
|
|
28
|
+
printSuccess(`${photonName} → instance: ${label}`);
|
|
29
|
+
// Refresh completions cache (picks up new instance)
|
|
30
|
+
try {
|
|
31
|
+
const { generateCompletionCache } = await import('../../shell-completions.js');
|
|
32
|
+
await generateCompletionCache();
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
// Best-effort: don't break the use command if cache refresh fails
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
const { printError } = await import('../../cli-formatter.js');
|
|
40
|
+
printError(getErrorMessage(error));
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
// Instances command: list all instances of a stateful photon
|
|
45
|
+
program
|
|
46
|
+
.command('instances')
|
|
47
|
+
.argument('<photon>', 'Photon name')
|
|
48
|
+
.description('List all instances of a stateful photon')
|
|
49
|
+
.action(async (photonName, _options, command) => {
|
|
50
|
+
try {
|
|
51
|
+
const { printInfo, printError, printHeader } = await import('../../cli-formatter.js');
|
|
52
|
+
const workingDir = getDefaultContext().baseDir;
|
|
53
|
+
const { InstanceStore } = await import('../../context-store.js');
|
|
54
|
+
const store = new InstanceStore(workingDir);
|
|
55
|
+
const instances = store.listInstances(photonName);
|
|
56
|
+
const current = store.getCurrentInstance(photonName) || 'default';
|
|
57
|
+
if (instances.length === 0) {
|
|
58
|
+
printInfo(`No instances found for ${photonName}.`);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
console.log('');
|
|
62
|
+
printHeader(`${photonName} — Instances`);
|
|
63
|
+
console.log('');
|
|
64
|
+
for (const name of instances) {
|
|
65
|
+
const marker = name === current ? ' ← current' : '';
|
|
66
|
+
console.log(` ${name}${marker}`);
|
|
67
|
+
}
|
|
68
|
+
console.log('');
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
const { printError } = await import('../../cli-formatter.js');
|
|
72
|
+
printError(getErrorMessage(error));
|
|
73
|
+
process.exit(1);
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
// Set command: configure environment for photons (primitive params without defaults)
|
|
77
|
+
program
|
|
78
|
+
.command('set')
|
|
79
|
+
.argument('<photon>', 'Photon name')
|
|
80
|
+
.argument('[args...]', 'Environment values (name=value pairs)')
|
|
81
|
+
.description('Configure environment for a photon (params without defaults)')
|
|
82
|
+
.action(async (photonName, args, _options, command) => {
|
|
83
|
+
try {
|
|
84
|
+
const { printInfo, printSuccess, printError, printHeader } = await import('../../cli-formatter.js');
|
|
85
|
+
const workingDir = getDefaultContext().baseDir;
|
|
86
|
+
// Resolve photon path (including bundled photons)
|
|
87
|
+
const { getBundledPhotonPath } = await import('../../shared-utils.js');
|
|
88
|
+
const { resolvePhotonPath } = await import('../../path-resolver.js');
|
|
89
|
+
const { fileURLToPath } = await import('url');
|
|
90
|
+
const path = await import('path');
|
|
91
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
92
|
+
// Go up two levels: commands/ -> cli/ -> src/
|
|
93
|
+
const distDir = path.resolve(__dirname, '..', '..');
|
|
94
|
+
const bundledPath = getBundledPhotonPath(photonName, distDir);
|
|
95
|
+
const filePath = bundledPath || (await resolvePhotonPath(photonName, workingDir));
|
|
96
|
+
if (!filePath) {
|
|
97
|
+
printError(`Photon not found: ${photonName}`);
|
|
98
|
+
process.exit(1);
|
|
99
|
+
}
|
|
100
|
+
// Extract constructor params and filter env params
|
|
101
|
+
const { SchemaExtractor } = await import('@portel/photon-core');
|
|
102
|
+
const fs = await import('fs/promises');
|
|
103
|
+
const source = await fs.readFile(filePath, 'utf-8');
|
|
104
|
+
const extractor = new SchemaExtractor();
|
|
105
|
+
const allParams = extractor.extractConstructorParams(source);
|
|
106
|
+
const { getEnvParams, EnvStore } = await import('../../context-store.js');
|
|
107
|
+
const envParams = getEnvParams(allParams);
|
|
108
|
+
if (envParams.length === 0) {
|
|
109
|
+
printInfo(`${photonName} has no environment parameters.`);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
const store = new EnvStore();
|
|
113
|
+
// Parse name=value pairs from args
|
|
114
|
+
const values = {};
|
|
115
|
+
const paramNames = new Set(envParams.map((p) => p.name));
|
|
116
|
+
for (const arg of args) {
|
|
117
|
+
const eqIdx = arg.indexOf('=');
|
|
118
|
+
if (eqIdx > 0) {
|
|
119
|
+
const key = arg.slice(0, eqIdx);
|
|
120
|
+
const val = arg.slice(eqIdx + 1);
|
|
121
|
+
if (paramNames.has(key)) {
|
|
122
|
+
values[key] = val;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
else if (envParams.length === 1) {
|
|
126
|
+
// Single env param: positional value
|
|
127
|
+
values[envParams[0].name] = arg;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Find params that still need values
|
|
131
|
+
const remaining = envParams.filter((p) => !(p.name in values));
|
|
132
|
+
if (remaining.length > 0) {
|
|
133
|
+
// Interactive mode for remaining params
|
|
134
|
+
console.log('');
|
|
135
|
+
printHeader(`${photonName} — Environment`);
|
|
136
|
+
console.log('');
|
|
137
|
+
const masked = store.getMasked(photonName);
|
|
138
|
+
const { promptText } = await import('../../shared/cli-utils.js');
|
|
139
|
+
for (const param of remaining) {
|
|
140
|
+
const currentDisplay = masked[param.name]
|
|
141
|
+
? `Current: ${masked[param.name]}`
|
|
142
|
+
: 'Not set';
|
|
143
|
+
const answer = await promptText(` ${param.name} (required)\n ${currentDisplay}\n > `);
|
|
144
|
+
if (answer.trim() !== '') {
|
|
145
|
+
values[param.name] = answer.trim();
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
if (Object.keys(values).length > 0) {
|
|
150
|
+
store.write(photonName, values);
|
|
151
|
+
const summary = Object.keys(values).join(', ');
|
|
152
|
+
printSuccess(`Environment saved: ${summary}`);
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
printInfo('No changes.');
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
const { printError } = await import('../../cli-formatter.js');
|
|
160
|
+
printError(getErrorMessage(error));
|
|
161
|
+
process.exit(1);
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/cli/commands/config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACrD,+DAA+D;IAC/D,OAAO;SACJ,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC;SACnC,QAAQ,CAAC,YAAY,EAAE,kCAAkC,CAAC;SAC1D,WAAW,CAAC,iDAAiD,CAAC;SAC9D,MAAM,CAAC,KAAK,EAAE,UAAkB,EAAE,QAAiB,EAAE,EAAE;QACtD,IAAI,CAAC;YACH,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;YAC5E,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;YAEnE,yEAAyE;YACzE,IAAI,eAAe,EAAE,CAAC,kBAAkB,CAAC,UAAU,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC;YAErE,MAAM,KAAK,GAAG,QAAQ,IAAI,SAAS,CAAC;YACpC,YAAY,CAAC,GAAG,UAAU,gBAAgB,KAAK,EAAE,CAAC,CAAC;YAEnD,oDAAoD;YACpD,IAAI,CAAC;gBACH,MAAM,EAAE,uBAAuB,EAAE,GAAG,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAC;gBAC/E,MAAM,uBAAuB,EAAE,CAAC;YAClC,CAAC;YAAC,MAAM,CAAC;gBACP,kEAAkE;YACpE,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;YAC9D,UAAU,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;YACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,6DAA6D;IAC7D,OAAO;SACJ,OAAO,CAAC,WAAW,CAAC;SACpB,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC;SACnC,WAAW,CAAC,yCAAyC,CAAC;SACtD,MAAM,CAAC,KAAK,EAAE,UAAkB,EAAE,QAAiB,EAAE,OAAgB,EAAE,EAAE;QACxE,IAAI,CAAC;YACH,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;YACtF,MAAM,UAAU,GAAG,iBAAiB,EAAE,CAAC,OAAO,CAAC;YAC/C,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;YACjE,MAAM,KAAK,GAAG,IAAI,aAAa,CAAC,UAAU,CAAC,CAAC;YAE5C,MAAM,SAAS,GAAG,KAAK,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;YAClD,MAAM,OAAO,GAAG,KAAK,CAAC,kBAAkB,CAAC,UAAU,CAAC,IAAI,SAAS,CAAC;YAElE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,SAAS,CAAC,0BAA0B,UAAU,GAAG,CAAC,CAAC;gBACnD,OAAO;YACT,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,WAAW,CAAC,GAAG,UAAU,cAAc,CAAC,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;gBAC7B,MAAM,MAAM,GAAG,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpD,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,MAAM,EAAE,CAAC,CAAC;YACpC,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;YAC9D,UAAU,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;YACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,qFAAqF;IACrF,OAAO;SACJ,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC;SACnC,QAAQ,CAAC,WAAW,EAAE,uCAAuC,CAAC;SAC9D,WAAW,CAAC,8DAA8D,CAAC;SAC3E,MAAM,CAAC,KAAK,EAAE,UAAkB,EAAE,IAAc,EAAE,QAAiB,EAAE,OAAgB,EAAE,EAAE;QACxF,IAAI,CAAC;YACH,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,GACxD,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;YACzC,MAAM,UAAU,GAAG,iBAAiB,EAAE,CAAC,OAAO,CAAC;YAE/C,kDAAkD;YAClD,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;YACvE,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;YACrE,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAC/D,8CAA8C;YAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YACpD,MAAM,WAAW,GAAG,oBAAoB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAC9D,MAAM,QAAQ,GAAG,WAAW,IAAI,CAAC,MAAM,iBAAiB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;YAElF,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,UAAU,CAAC,qBAAqB,UAAU,EAAE,CAAC,CAAC;gBAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,mDAAmD;YACnD,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;YAChE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;YACvC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACpD,MAAM,SAAS,GAAG,IAAI,eAAe,EAAE,CAAC;YACxC,MAAM,SAAS,GAAG,SAAS,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC;YAC7D,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;YAC1E,MAAM,SAAS,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;YAE1C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,SAAS,CAAC,GAAG,UAAU,iCAAiC,CAAC,CAAC;gBAC1D,OAAO;YACT,CAAC;YAED,MAAM,KAAK,GAAG,IAAI,QAAQ,EAAE,CAAC;YAE7B,mCAAmC;YACnC,MAAM,MAAM,GAA2B,EAAE,CAAC;YAC1C,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAE3E,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAC/B,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;oBACd,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;oBAChC,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;oBACjC,IAAI,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;wBACxB,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;oBACpB,CAAC;gBACH,CAAC;qBAAM,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAClC,qCAAqC;oBACrC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;gBAClC,CAAC;YACH,CAAC;YAED,qCAAqC;YACrC,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC;YAEjF,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,wCAAwC;gBACxC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,WAAW,CAAC,GAAG,UAAU,gBAAgB,CAAC,CAAC;gBAC3C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAEhB,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;gBAC3C,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;gBAEjE,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;oBAC9B,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;wBACvC,CAAC,CAAC,YAAY,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;wBAClC,CAAC,CAAC,SAAS,CAAC;oBACd,MAAM,MAAM,GAAG,MAAM,UAAU,CAC7B,KAAK,KAAK,CAAC,IAAI,kBAAkB,cAAc,QAAQ,CACxD,CAAC;oBACF,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;wBACzB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;oBACrC,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnC,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;gBAChC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC/C,YAAY,CAAC,sBAAsB,OAAO,EAAE,CAAC,CAAC;YAChD,CAAC;iBAAM,CAAC;gBACN,SAAS,CAAC,aAAa,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;YAC9D,UAAU,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;YACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Daemon CLI Command Group
|
|
3
|
+
*
|
|
4
|
+
* Manage the Photon background daemon process (start, stop, restart, status).
|
|
5
|
+
*/
|
|
6
|
+
import type { Command } from 'commander';
|
|
7
|
+
/**
|
|
8
|
+
* Register daemon command group
|
|
9
|
+
*/
|
|
10
|
+
export declare function registerDaemonCommands(program: Command): void;
|
|
11
|
+
//# sourceMappingURL=daemon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/daemon.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkG7D"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Daemon CLI Command Group
|
|
3
|
+
*
|
|
4
|
+
* Manage the Photon background daemon process (start, stop, restart, status).
|
|
5
|
+
*/
|
|
6
|
+
import { getErrorMessage } from '../../shared/error-handler.js';
|
|
7
|
+
/**
|
|
8
|
+
* Register daemon command group
|
|
9
|
+
*/
|
|
10
|
+
export function registerDaemonCommands(program) {
|
|
11
|
+
const daemonCmd = program.command('daemon').description('Manage the Photon background daemon');
|
|
12
|
+
daemonCmd
|
|
13
|
+
.command('start')
|
|
14
|
+
.description('Start the daemon (no-op if already running)')
|
|
15
|
+
.action(async () => {
|
|
16
|
+
try {
|
|
17
|
+
const { printInfo, printSuccess, printError } = await import('../../cli-formatter.js');
|
|
18
|
+
const { ensureDaemon, isGlobalDaemonRunning } = await import('../../daemon/manager.js');
|
|
19
|
+
if (isGlobalDaemonRunning()) {
|
|
20
|
+
printInfo('Daemon is already running.');
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
await ensureDaemon(false);
|
|
24
|
+
printSuccess('Daemon started.');
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
const { printError } = await import('../../cli-formatter.js');
|
|
28
|
+
printError(`Failed to start daemon: ${getErrorMessage(error)}`);
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
daemonCmd
|
|
33
|
+
.command('stop')
|
|
34
|
+
.description('Stop the running daemon')
|
|
35
|
+
.action(async () => {
|
|
36
|
+
try {
|
|
37
|
+
const { printInfo, printSuccess, printError } = await import('../../cli-formatter.js');
|
|
38
|
+
const { stopGlobalDaemon, isGlobalDaemonRunning } = await import('../../daemon/manager.js');
|
|
39
|
+
if (!isGlobalDaemonRunning()) {
|
|
40
|
+
printInfo('Daemon is not running.');
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
stopGlobalDaemon();
|
|
44
|
+
printSuccess('Daemon stopped.');
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
const { printError } = await import('../../cli-formatter.js');
|
|
48
|
+
printError(`Failed to stop daemon: ${getErrorMessage(error)}`);
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
daemonCmd
|
|
53
|
+
.command('restart')
|
|
54
|
+
.description('Restart the daemon')
|
|
55
|
+
.action(async () => {
|
|
56
|
+
try {
|
|
57
|
+
const { printSuccess, printError } = await import('../../cli-formatter.js');
|
|
58
|
+
const { restartGlobalDaemon } = await import('../../daemon/manager.js');
|
|
59
|
+
await restartGlobalDaemon();
|
|
60
|
+
printSuccess('Daemon restarted.');
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
const { printError } = await import('../../cli-formatter.js');
|
|
64
|
+
printError(`Failed to restart daemon: ${getErrorMessage(error)}`);
|
|
65
|
+
process.exit(1);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
daemonCmd
|
|
69
|
+
.command('status')
|
|
70
|
+
.description('Show daemon status and health info')
|
|
71
|
+
.action(async () => {
|
|
72
|
+
try {
|
|
73
|
+
const { printInfo, printSuccess, printError } = await import('../../cli-formatter.js');
|
|
74
|
+
const { isGlobalDaemonRunning, GLOBAL_PID_FILE, GLOBAL_LOG_FILE } = await import('../../daemon/manager.js');
|
|
75
|
+
const running = isGlobalDaemonRunning();
|
|
76
|
+
if (running) {
|
|
77
|
+
const { readFileSync, existsSync } = await import('fs');
|
|
78
|
+
const pid = existsSync(GLOBAL_PID_FILE)
|
|
79
|
+
? readFileSync(GLOBAL_PID_FILE, 'utf-8').trim()
|
|
80
|
+
: 'unknown';
|
|
81
|
+
printSuccess(`Daemon is running (PID ${pid})`);
|
|
82
|
+
console.log(` Log: ${GLOBAL_LOG_FILE}`);
|
|
83
|
+
// Query daemon for health info
|
|
84
|
+
const { queryDaemonStatus } = await import('../../daemon/client.js');
|
|
85
|
+
const health = await queryDaemonStatus();
|
|
86
|
+
if (health) {
|
|
87
|
+
const uptimeSec = Math.round(health.uptime);
|
|
88
|
+
const hours = Math.floor(uptimeSec / 3600);
|
|
89
|
+
const mins = Math.floor((uptimeSec % 3600) / 60);
|
|
90
|
+
const uptimeStr = hours > 0 ? `${hours}h ${mins}m` : `${mins}m`;
|
|
91
|
+
console.log(` Uptime: ${uptimeStr}`);
|
|
92
|
+
console.log(` Memory: ${health.memoryMB} MB`);
|
|
93
|
+
console.log(` Sessions: ${health.sessions}`);
|
|
94
|
+
console.log(` Photons loaded: ${health.photonsLoaded}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
printInfo('Daemon is not running.');
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
const { printError } = await import('../../cli-formatter.js');
|
|
103
|
+
printError(`Failed to check daemon status: ${getErrorMessage(error)}`);
|
|
104
|
+
process.exit(1);
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=daemon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../../src/cli/commands/daemon.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Doctor CLI Command
|
|
3
|
+
*
|
|
4
|
+
* Run diagnostics on the photon environment, ports, and per-photon configuration.
|
|
5
|
+
*/
|
|
6
|
+
import type { Command } from 'commander';
|
|
7
|
+
/**
|
|
8
|
+
* Register the `doctor` command.
|
|
9
|
+
*
|
|
10
|
+
* Runs environment diagnostics: Node version, npm, working directory, cache,
|
|
11
|
+
* port availability, marketplace configuration, and optional per-photon checks.
|
|
12
|
+
*/
|
|
13
|
+
export declare function registerDoctorCommand(program: Command): void;
|
|
14
|
+
//# sourceMappingURL=doctor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+DzC;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwM5D"}
|