@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.
Files changed (294) hide show
  1. package/README.md +163 -210
  2. package/dist/async/dedup-map.d.ts +40 -0
  3. package/dist/async/dedup-map.d.ts.map +1 -0
  4. package/dist/async/dedup-map.js +80 -0
  5. package/dist/async/dedup-map.js.map +1 -0
  6. package/dist/async/index.d.ts +11 -0
  7. package/dist/async/index.d.ts.map +1 -0
  8. package/dist/async/index.js +11 -0
  9. package/dist/async/index.js.map +1 -0
  10. package/dist/async/loading-gate.d.ts +27 -0
  11. package/dist/async/loading-gate.d.ts.map +1 -0
  12. package/dist/async/loading-gate.js +48 -0
  13. package/dist/async/loading-gate.js.map +1 -0
  14. package/dist/async/with-timeout.d.ts +6 -0
  15. package/dist/async/with-timeout.d.ts.map +1 -0
  16. package/dist/async/with-timeout.js +17 -0
  17. package/dist/async/with-timeout.js.map +1 -0
  18. package/dist/auto-ui/beam/class-metadata.d.ts +52 -0
  19. package/dist/auto-ui/beam/class-metadata.d.ts.map +1 -0
  20. package/dist/auto-ui/beam/class-metadata.js +133 -0
  21. package/dist/auto-ui/beam/class-metadata.js.map +1 -0
  22. package/dist/auto-ui/beam/config.d.ts +13 -0
  23. package/dist/auto-ui/beam/config.d.ts.map +1 -0
  24. package/dist/auto-ui/beam/config.js +52 -0
  25. package/dist/auto-ui/beam/config.js.map +1 -0
  26. package/dist/auto-ui/beam/external-mcp.d.ts +37 -0
  27. package/dist/auto-ui/beam/external-mcp.d.ts.map +1 -0
  28. package/dist/auto-ui/beam/external-mcp.js +311 -0
  29. package/dist/auto-ui/beam/external-mcp.js.map +1 -0
  30. package/dist/auto-ui/beam/photon-management.d.ts +51 -0
  31. package/dist/auto-ui/beam/photon-management.d.ts.map +1 -0
  32. package/dist/auto-ui/beam/photon-management.js +310 -0
  33. package/dist/auto-ui/beam/photon-management.js.map +1 -0
  34. package/dist/auto-ui/beam/routes/api-browse.d.ts +17 -0
  35. package/dist/auto-ui/beam/routes/api-browse.d.ts.map +1 -0
  36. package/dist/auto-ui/beam/routes/api-browse.js +531 -0
  37. package/dist/auto-ui/beam/routes/api-browse.js.map +1 -0
  38. package/dist/auto-ui/beam/routes/api-config.d.ts +9 -0
  39. package/dist/auto-ui/beam/routes/api-config.d.ts.map +1 -0
  40. package/dist/auto-ui/beam/routes/api-config.js +494 -0
  41. package/dist/auto-ui/beam/routes/api-config.js.map +1 -0
  42. package/dist/auto-ui/beam/routes/api-marketplace.d.ts +8 -0
  43. package/dist/auto-ui/beam/routes/api-marketplace.d.ts.map +1 -0
  44. package/dist/auto-ui/beam/routes/api-marketplace.js +490 -0
  45. package/dist/auto-ui/beam/routes/api-marketplace.js.map +1 -0
  46. package/dist/auto-ui/beam/startup.d.ts +41 -0
  47. package/dist/auto-ui/beam/startup.d.ts.map +1 -0
  48. package/dist/auto-ui/beam/startup.js +98 -0
  49. package/dist/auto-ui/beam/startup.js.map +1 -0
  50. package/dist/auto-ui/beam/subscription.d.ts +35 -0
  51. package/dist/auto-ui/beam/subscription.d.ts.map +1 -0
  52. package/dist/auto-ui/beam/subscription.js +151 -0
  53. package/dist/auto-ui/beam/subscription.js.map +1 -0
  54. package/dist/auto-ui/beam/types.d.ts +103 -0
  55. package/dist/auto-ui/beam/types.d.ts.map +1 -0
  56. package/dist/auto-ui/beam/types.js +8 -0
  57. package/dist/auto-ui/beam/types.js.map +1 -0
  58. package/dist/auto-ui/beam.d.ts +2 -0
  59. package/dist/auto-ui/beam.d.ts.map +1 -1
  60. package/dist/auto-ui/beam.js +729 -2596
  61. package/dist/auto-ui/beam.js.map +1 -1
  62. package/dist/auto-ui/bridge/index.d.ts.map +1 -1
  63. package/dist/auto-ui/bridge/index.js +10 -2
  64. package/dist/auto-ui/bridge/index.js.map +1 -1
  65. package/dist/auto-ui/components/card.d.ts.map +1 -1
  66. package/dist/auto-ui/components/card.js +3 -1
  67. package/dist/auto-ui/components/card.js.map +1 -1
  68. package/dist/auto-ui/components/progress.d.ts.map +1 -1
  69. package/dist/auto-ui/components/progress.js.map +1 -1
  70. package/dist/auto-ui/daemon-tools.d.ts +1 -1
  71. package/dist/auto-ui/daemon-tools.d.ts.map +1 -1
  72. package/dist/auto-ui/daemon-tools.js +4 -3
  73. package/dist/auto-ui/daemon-tools.js.map +1 -1
  74. package/dist/auto-ui/photon-bridge.d.ts +6 -2
  75. package/dist/auto-ui/photon-bridge.d.ts.map +1 -1
  76. package/dist/auto-ui/photon-bridge.js +20 -8
  77. package/dist/auto-ui/photon-bridge.js.map +1 -1
  78. package/dist/auto-ui/platform-compat.d.ts.map +1 -1
  79. package/dist/auto-ui/platform-compat.js +4 -0
  80. package/dist/auto-ui/platform-compat.js.map +1 -1
  81. package/dist/auto-ui/streamable-http-transport.d.ts +4 -2
  82. package/dist/auto-ui/streamable-http-transport.d.ts.map +1 -1
  83. package/dist/auto-ui/streamable-http-transport.js +120 -30
  84. package/dist/auto-ui/streamable-http-transport.js.map +1 -1
  85. package/dist/auto-ui/types.d.ts +4 -2
  86. package/dist/auto-ui/types.d.ts.map +1 -1
  87. package/dist/auto-ui/types.js.map +1 -1
  88. package/dist/beam.bundle.js +8225 -3999
  89. package/dist/beam.bundle.js.map +4 -4
  90. package/dist/cli/commands/alias.d.ts +14 -0
  91. package/dist/cli/commands/alias.d.ts.map +1 -0
  92. package/dist/cli/commands/alias.js +41 -0
  93. package/dist/cli/commands/alias.js.map +1 -0
  94. package/dist/cli/commands/audit.d.ts +9 -0
  95. package/dist/cli/commands/audit.d.ts.map +1 -0
  96. package/dist/cli/commands/audit.js +377 -0
  97. package/dist/cli/commands/audit.js.map +1 -0
  98. package/dist/cli/commands/beam.d.ts +20 -0
  99. package/dist/cli/commands/beam.d.ts.map +1 -0
  100. package/dist/cli/commands/beam.js +256 -0
  101. package/dist/cli/commands/beam.js.map +1 -0
  102. package/dist/cli/commands/config.d.ts +14 -0
  103. package/dist/cli/commands/config.d.ts.map +1 -0
  104. package/dist/cli/commands/config.js +165 -0
  105. package/dist/cli/commands/config.js.map +1 -0
  106. package/dist/cli/commands/daemon.d.ts +11 -0
  107. package/dist/cli/commands/daemon.d.ts.map +1 -0
  108. package/dist/cli/commands/daemon.js +108 -0
  109. package/dist/cli/commands/daemon.js.map +1 -0
  110. package/dist/cli/commands/doctor.d.ts +14 -0
  111. package/dist/cli/commands/doctor.d.ts.map +1 -0
  112. package/dist/cli/commands/doctor.js +257 -0
  113. package/dist/cli/commands/doctor.js.map +1 -0
  114. package/dist/cli/commands/host.d.ts +11 -0
  115. package/dist/cli/commands/host.d.ts.map +1 -0
  116. package/dist/cli/commands/host.js +96 -0
  117. package/dist/cli/commands/host.js.map +1 -0
  118. package/dist/cli/commands/info.d.ts +1 -1
  119. package/dist/cli/commands/info.d.ts.map +1 -1
  120. package/dist/cli/commands/info.js +16 -15
  121. package/dist/cli/commands/info.js.map +1 -1
  122. package/dist/cli/commands/init.d.ts +20 -0
  123. package/dist/cli/commands/init.d.ts.map +1 -0
  124. package/dist/cli/commands/init.js +774 -0
  125. package/dist/cli/commands/init.js.map +1 -0
  126. package/dist/cli/commands/maker.d.ts +12 -0
  127. package/dist/cli/commands/maker.d.ts.map +1 -0
  128. package/dist/cli/commands/maker.js +605 -0
  129. package/dist/cli/commands/maker.js.map +1 -0
  130. package/dist/cli/commands/mcp.d.ts +27 -0
  131. package/dist/cli/commands/mcp.d.ts.map +1 -0
  132. package/dist/cli/commands/mcp.js +390 -0
  133. package/dist/cli/commands/mcp.js.map +1 -0
  134. package/dist/cli/commands/package-app.d.ts +1 -1
  135. package/dist/cli/commands/package-app.d.ts.map +1 -1
  136. package/dist/cli/commands/package-app.js +5 -4
  137. package/dist/cli/commands/package-app.js.map +1 -1
  138. package/dist/cli/commands/package.d.ts +1 -1
  139. package/dist/cli/commands/package.d.ts.map +1 -1
  140. package/dist/cli/commands/package.js +134 -32
  141. package/dist/cli/commands/package.js.map +1 -1
  142. package/dist/cli/commands/run.d.ts +34 -0
  143. package/dist/cli/commands/run.d.ts.map +1 -0
  144. package/dist/cli/commands/run.js +334 -0
  145. package/dist/cli/commands/run.js.map +1 -0
  146. package/dist/cli/commands/search.d.ts +11 -0
  147. package/dist/cli/commands/search.d.ts.map +1 -0
  148. package/dist/cli/commands/search.js +60 -0
  149. package/dist/cli/commands/search.js.map +1 -0
  150. package/dist/cli/commands/serve.d.ts +11 -0
  151. package/dist/cli/commands/serve.d.ts.map +1 -0
  152. package/dist/cli/commands/serve.js +138 -0
  153. package/dist/cli/commands/serve.js.map +1 -0
  154. package/dist/cli/commands/test.d.ts +14 -0
  155. package/dist/cli/commands/test.d.ts.map +1 -0
  156. package/dist/cli/commands/test.js +51 -0
  157. package/dist/cli/commands/test.js.map +1 -0
  158. package/dist/cli/commands/update.d.ts +11 -0
  159. package/dist/cli/commands/update.d.ts.map +1 -0
  160. package/dist/cli/commands/update.js +72 -0
  161. package/dist/cli/commands/update.js.map +1 -0
  162. package/dist/cli/index.d.ts +14 -0
  163. package/dist/cli/index.d.ts.map +1 -0
  164. package/dist/cli/index.js +139 -0
  165. package/dist/cli/index.js.map +1 -0
  166. package/dist/cli-alias.js +2 -2
  167. package/dist/cli-alias.js.map +1 -1
  168. package/dist/cli.d.ts +3 -16
  169. package/dist/cli.d.ts.map +1 -1
  170. package/dist/cli.js +4 -2725
  171. package/dist/cli.js.map +1 -1
  172. package/dist/context-store.d.ts +13 -12
  173. package/dist/context-store.d.ts.map +1 -1
  174. package/dist/context-store.js +47 -23
  175. package/dist/context-store.js.map +1 -1
  176. package/dist/context.d.ts +35 -0
  177. package/dist/context.d.ts.map +1 -0
  178. package/dist/context.js +38 -0
  179. package/dist/context.js.map +1 -0
  180. package/dist/daemon/client.d.ts +25 -13
  181. package/dist/daemon/client.d.ts.map +1 -1
  182. package/dist/daemon/client.js +183 -135
  183. package/dist/daemon/client.js.map +1 -1
  184. package/dist/daemon/manager.d.ts +58 -26
  185. package/dist/daemon/manager.d.ts.map +1 -1
  186. package/dist/daemon/manager.js +348 -157
  187. package/dist/daemon/manager.js.map +1 -1
  188. package/dist/daemon/protocol.d.ts +9 -3
  189. package/dist/daemon/protocol.d.ts.map +1 -1
  190. package/dist/daemon/protocol.js +2 -0
  191. package/dist/daemon/protocol.js.map +1 -1
  192. package/dist/daemon/server.js +850 -200
  193. package/dist/daemon/server.js.map +1 -1
  194. package/dist/daemon/session-manager.d.ts +16 -2
  195. package/dist/daemon/session-manager.d.ts.map +1 -1
  196. package/dist/daemon/session-manager.js +65 -7
  197. package/dist/daemon/session-manager.js.map +1 -1
  198. package/dist/daemon/state-machine.d.ts +22 -0
  199. package/dist/daemon/state-machine.d.ts.map +1 -0
  200. package/dist/daemon/state-machine.js +48 -0
  201. package/dist/daemon/state-machine.js.map +1 -0
  202. package/dist/deploy/cloudflare.d.ts.map +1 -1
  203. package/dist/deploy/cloudflare.js +5 -5
  204. package/dist/deploy/cloudflare.js.map +1 -1
  205. package/dist/loader.d.ts +65 -7
  206. package/dist/loader.d.ts.map +1 -1
  207. package/dist/loader.js +587 -63
  208. package/dist/loader.js.map +1 -1
  209. package/dist/marketplace-manager.d.ts +84 -12
  210. package/dist/marketplace-manager.d.ts.map +1 -1
  211. package/dist/marketplace-manager.js +470 -26
  212. package/dist/marketplace-manager.js.map +1 -1
  213. package/dist/path-resolver.d.ts +3 -1
  214. package/dist/path-resolver.d.ts.map +1 -1
  215. package/dist/path-resolver.js +4 -3
  216. package/dist/path-resolver.js.map +1 -1
  217. package/dist/photon-cli-runner.d.ts +1 -1
  218. package/dist/photon-cli-runner.d.ts.map +1 -1
  219. package/dist/photon-cli-runner.js +34 -44
  220. package/dist/photon-cli-runner.js.map +1 -1
  221. package/dist/photon-doc-extractor.d.ts +1 -0
  222. package/dist/photon-doc-extractor.d.ts.map +1 -1
  223. package/dist/photon-doc-extractor.js +33 -12
  224. package/dist/photon-doc-extractor.js.map +1 -1
  225. package/dist/photons/maker.photon.d.ts.map +1 -1
  226. package/dist/photons/maker.photon.js +4 -4
  227. package/dist/photons/maker.photon.js.map +1 -1
  228. package/dist/photons/maker.photon.ts +4 -3
  229. package/dist/photons/marketplace.photon.d.ts.map +1 -1
  230. package/dist/photons/marketplace.photon.js +10 -27
  231. package/dist/photons/marketplace.photon.js.map +1 -1
  232. package/dist/photons/marketplace.photon.ts +14 -33
  233. package/dist/photons/tunnel.photon.d.ts.map +1 -1
  234. package/dist/photons/tunnel.photon.js +4 -8
  235. package/dist/photons/tunnel.photon.js.map +1 -1
  236. package/dist/photons/tunnel.photon.ts +4 -7
  237. package/dist/serv/session/kv-store.d.ts +1 -1
  238. package/dist/serv/session/kv-store.d.ts.map +1 -1
  239. package/dist/serv/session/store.d.ts.map +1 -1
  240. package/dist/serv/session/store.js +16 -14
  241. package/dist/serv/session/store.js.map +1 -1
  242. package/dist/serv/vault/token-vault.js +1 -1
  243. package/dist/serv/vault/token-vault.js.map +1 -1
  244. package/dist/server.d.ts +34 -12
  245. package/dist/server.d.ts.map +1 -1
  246. package/dist/server.js +364 -313
  247. package/dist/server.js.map +1 -1
  248. package/dist/shared/audit.d.ts +30 -0
  249. package/dist/shared/audit.d.ts.map +1 -0
  250. package/dist/shared/audit.js +89 -0
  251. package/dist/shared/audit.js.map +1 -0
  252. package/dist/shared/cli-sections.d.ts +0 -4
  253. package/dist/shared/cli-sections.d.ts.map +1 -1
  254. package/dist/shared/cli-sections.js +0 -6
  255. package/dist/shared/cli-sections.js.map +1 -1
  256. package/dist/shared/cli-utils.d.ts +2 -56
  257. package/dist/shared/cli-utils.d.ts.map +1 -1
  258. package/dist/shared/cli-utils.js +1 -87
  259. package/dist/shared/cli-utils.js.map +1 -1
  260. package/dist/shared/error-handler.d.ts +6 -72
  261. package/dist/shared/error-handler.d.ts.map +1 -1
  262. package/dist/shared/error-handler.js +22 -213
  263. package/dist/shared/error-handler.js.map +1 -1
  264. package/dist/shared/security.d.ts +0 -9
  265. package/dist/shared/security.d.ts.map +1 -1
  266. package/dist/shared/security.js +0 -30
  267. package/dist/shared/security.js.map +1 -1
  268. package/dist/shared-utils.d.ts +0 -26
  269. package/dist/shared-utils.d.ts.map +1 -1
  270. package/dist/shared-utils.js +0 -44
  271. package/dist/shared-utils.js.map +1 -1
  272. package/dist/shell-completions.d.ts +1 -1
  273. package/dist/shell-completions.d.ts.map +1 -1
  274. package/dist/shell-completions.js +5 -5
  275. package/dist/shell-completions.js.map +1 -1
  276. package/dist/template-manager.d.ts.map +1 -1
  277. package/dist/template-manager.js +14 -1
  278. package/dist/template-manager.js.map +1 -1
  279. package/dist/test-runner.d.ts +0 -12
  280. package/dist/test-runner.d.ts.map +1 -1
  281. package/dist/test-runner.js +4 -39
  282. package/dist/test-runner.js.map +1 -1
  283. package/dist/testing.d.ts +1 -1
  284. package/dist/testing.d.ts.map +1 -1
  285. package/dist/testing.js +2 -2
  286. package/dist/testing.js.map +1 -1
  287. package/dist/version-checker.d.ts +4 -4
  288. package/dist/version-checker.d.ts.map +1 -1
  289. package/dist/version-checker.js +33 -4
  290. package/dist/version-checker.js.map +1 -1
  291. package/dist/watcher.d.ts.map +1 -1
  292. package/dist/watcher.js +14 -12
  293. package/dist/watcher.js.map +1 -1
  294. 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":"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"}
@@ -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"}