@portel/photon 1.4.0 → 1.5.1

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 (379) hide show
  1. package/README.md +287 -1160
  2. package/dist/auto-ui/beam.d.ts +9 -0
  3. package/dist/auto-ui/beam.d.ts.map +1 -0
  4. package/dist/auto-ui/beam.js +2381 -0
  5. package/dist/auto-ui/beam.js.map +1 -0
  6. package/dist/auto-ui/components/card.d.ts +13 -0
  7. package/dist/auto-ui/components/card.d.ts.map +1 -0
  8. package/dist/auto-ui/components/card.js +64 -0
  9. package/dist/auto-ui/components/card.js.map +1 -0
  10. package/dist/auto-ui/components/form.d.ts +15 -0
  11. package/dist/auto-ui/components/form.d.ts.map +1 -0
  12. package/dist/auto-ui/components/form.js +72 -0
  13. package/dist/auto-ui/components/form.js.map +1 -0
  14. package/dist/auto-ui/components/list.d.ts +13 -0
  15. package/dist/auto-ui/components/list.d.ts.map +1 -0
  16. package/dist/auto-ui/components/list.js +58 -0
  17. package/dist/auto-ui/components/list.js.map +1 -0
  18. package/dist/auto-ui/components/progress.d.ts +18 -0
  19. package/dist/auto-ui/components/progress.d.ts.map +1 -0
  20. package/dist/auto-ui/components/progress.js +125 -0
  21. package/dist/auto-ui/components/progress.js.map +1 -0
  22. package/dist/auto-ui/components/table.d.ts +13 -0
  23. package/dist/auto-ui/components/table.d.ts.map +1 -0
  24. package/dist/auto-ui/components/table.js +82 -0
  25. package/dist/auto-ui/components/table.js.map +1 -0
  26. package/dist/auto-ui/components/tree.d.ts +13 -0
  27. package/dist/auto-ui/components/tree.d.ts.map +1 -0
  28. package/dist/auto-ui/components/tree.js +61 -0
  29. package/dist/auto-ui/components/tree.js.map +1 -0
  30. package/dist/auto-ui/daemon-tools.d.ts +45 -0
  31. package/dist/auto-ui/daemon-tools.d.ts.map +1 -0
  32. package/dist/auto-ui/daemon-tools.js +580 -0
  33. package/dist/auto-ui/daemon-tools.js.map +1 -0
  34. package/dist/auto-ui/design-system/index.d.ts +21 -0
  35. package/dist/auto-ui/design-system/index.d.ts.map +1 -0
  36. package/dist/auto-ui/design-system/index.js +27 -0
  37. package/dist/auto-ui/design-system/index.js.map +1 -0
  38. package/dist/auto-ui/design-system/tokens.d.ts +9 -0
  39. package/dist/auto-ui/design-system/tokens.d.ts.map +1 -0
  40. package/dist/auto-ui/design-system/tokens.js +27 -0
  41. package/dist/auto-ui/design-system/tokens.js.map +1 -0
  42. package/dist/auto-ui/design-system/transaction-ui.d.ts +70 -0
  43. package/dist/auto-ui/design-system/transaction-ui.d.ts.map +1 -0
  44. package/dist/auto-ui/design-system/transaction-ui.js +982 -0
  45. package/dist/auto-ui/design-system/transaction-ui.js.map +1 -0
  46. package/dist/auto-ui/frontend/index.html +84 -0
  47. package/dist/auto-ui/index.d.ts +21 -0
  48. package/dist/auto-ui/index.d.ts.map +1 -0
  49. package/dist/auto-ui/index.js +25 -0
  50. package/dist/auto-ui/index.js.map +1 -0
  51. package/dist/auto-ui/openapi-generator.d.ts +71 -0
  52. package/dist/auto-ui/openapi-generator.d.ts.map +1 -0
  53. package/dist/auto-ui/openapi-generator.js +223 -0
  54. package/dist/auto-ui/openapi-generator.js.map +1 -0
  55. package/dist/auto-ui/photon-bridge.d.ts +159 -0
  56. package/dist/auto-ui/photon-bridge.d.ts.map +1 -0
  57. package/dist/auto-ui/photon-bridge.js +262 -0
  58. package/dist/auto-ui/photon-bridge.js.map +1 -0
  59. package/dist/auto-ui/photon-host.d.ts +113 -0
  60. package/dist/auto-ui/photon-host.d.ts.map +1 -0
  61. package/dist/auto-ui/photon-host.js +284 -0
  62. package/dist/auto-ui/photon-host.js.map +1 -0
  63. package/dist/auto-ui/platform-compat.d.ts +71 -0
  64. package/dist/auto-ui/platform-compat.d.ts.map +1 -0
  65. package/dist/auto-ui/platform-compat.js +574 -0
  66. package/dist/auto-ui/platform-compat.js.map +1 -0
  67. package/dist/auto-ui/playground-html.d.ts +15 -0
  68. package/dist/auto-ui/playground-html.d.ts.map +1 -0
  69. package/dist/auto-ui/playground-html.js +1113 -0
  70. package/dist/auto-ui/playground-html.js.map +1 -0
  71. package/dist/auto-ui/playground-server.d.ts +7 -0
  72. package/dist/auto-ui/playground-server.d.ts.map +1 -0
  73. package/dist/auto-ui/playground-server.js +840 -0
  74. package/dist/auto-ui/playground-server.js.map +1 -0
  75. package/dist/auto-ui/registry.d.ts +13 -0
  76. package/dist/auto-ui/registry.d.ts.map +1 -0
  77. package/dist/auto-ui/registry.js +62 -0
  78. package/dist/auto-ui/registry.js.map +1 -0
  79. package/dist/auto-ui/renderer.d.ts +14 -0
  80. package/dist/auto-ui/renderer.d.ts.map +1 -0
  81. package/dist/auto-ui/renderer.js +88 -0
  82. package/dist/auto-ui/renderer.js.map +1 -0
  83. package/dist/auto-ui/rendering/components.d.ts +29 -0
  84. package/dist/auto-ui/rendering/components.d.ts.map +1 -0
  85. package/dist/auto-ui/rendering/components.js +773 -0
  86. package/dist/auto-ui/rendering/components.js.map +1 -0
  87. package/dist/auto-ui/rendering/field-analyzer.d.ts +48 -0
  88. package/dist/auto-ui/rendering/field-analyzer.d.ts.map +1 -0
  89. package/dist/auto-ui/rendering/field-analyzer.js +270 -0
  90. package/dist/auto-ui/rendering/field-analyzer.js.map +1 -0
  91. package/dist/auto-ui/rendering/field-renderers.d.ts +64 -0
  92. package/dist/auto-ui/rendering/field-renderers.d.ts.map +1 -0
  93. package/dist/auto-ui/rendering/field-renderers.js +317 -0
  94. package/dist/auto-ui/rendering/field-renderers.js.map +1 -0
  95. package/dist/auto-ui/rendering/index.d.ts +28 -0
  96. package/dist/auto-ui/rendering/index.d.ts.map +1 -0
  97. package/dist/auto-ui/rendering/index.js +60 -0
  98. package/dist/auto-ui/rendering/index.js.map +1 -0
  99. package/dist/auto-ui/rendering/layout-selector.d.ts +48 -0
  100. package/dist/auto-ui/rendering/layout-selector.d.ts.map +1 -0
  101. package/dist/auto-ui/rendering/layout-selector.js +352 -0
  102. package/dist/auto-ui/rendering/layout-selector.js.map +1 -0
  103. package/dist/auto-ui/rendering/template-engine.d.ts +41 -0
  104. package/dist/auto-ui/rendering/template-engine.d.ts.map +1 -0
  105. package/dist/auto-ui/rendering/template-engine.js +238 -0
  106. package/dist/auto-ui/rendering/template-engine.js.map +1 -0
  107. package/dist/auto-ui/streamable-http-transport.d.ts +79 -0
  108. package/dist/auto-ui/streamable-http-transport.d.ts.map +1 -0
  109. package/dist/auto-ui/streamable-http-transport.js +1314 -0
  110. package/dist/auto-ui/streamable-http-transport.js.map +1 -0
  111. package/dist/auto-ui/types.d.ts +310 -0
  112. package/dist/auto-ui/types.d.ts.map +1 -0
  113. package/dist/auto-ui/types.js +71 -0
  114. package/dist/auto-ui/types.js.map +1 -0
  115. package/dist/beam.bundle.js +13506 -0
  116. package/dist/beam.bundle.js.map +7 -0
  117. package/dist/claude-code-plugin.d.ts.map +1 -1
  118. package/dist/claude-code-plugin.js +30 -30
  119. package/dist/claude-code-plugin.js.map +1 -1
  120. package/dist/cli/commands/info.d.ts +11 -0
  121. package/dist/cli/commands/info.d.ts.map +1 -0
  122. package/dist/cli/commands/info.js +313 -0
  123. package/dist/cli/commands/info.js.map +1 -0
  124. package/dist/cli/commands/marketplace.d.ts +11 -0
  125. package/dist/cli/commands/marketplace.d.ts.map +1 -0
  126. package/dist/cli/commands/marketplace.js +198 -0
  127. package/dist/cli/commands/marketplace.js.map +1 -0
  128. package/dist/cli/commands/package-app.d.ts +9 -0
  129. package/dist/cli/commands/package-app.d.ts.map +1 -0
  130. package/dist/cli/commands/package-app.js +191 -0
  131. package/dist/cli/commands/package-app.js.map +1 -0
  132. package/dist/cli/commands/package.d.ts +11 -0
  133. package/dist/cli/commands/package.d.ts.map +1 -0
  134. package/dist/cli/commands/package.js +573 -0
  135. package/dist/cli/commands/package.js.map +1 -0
  136. package/dist/cli-alias.d.ts.map +1 -1
  137. package/dist/cli-alias.js +30 -28
  138. package/dist/cli-alias.js.map +1 -1
  139. package/dist/cli-formatter.d.ts +8 -24
  140. package/dist/cli-formatter.d.ts.map +1 -1
  141. package/dist/cli-formatter.js +8 -325
  142. package/dist/cli-formatter.js.map +1 -1
  143. package/dist/cli.d.ts +15 -1
  144. package/dist/cli.d.ts.map +1 -1
  145. package/dist/cli.js +1157 -1132
  146. package/dist/cli.js.map +1 -1
  147. package/dist/daemon/client.d.ts +81 -0
  148. package/dist/daemon/client.d.ts.map +1 -1
  149. package/dist/daemon/client.js +583 -13
  150. package/dist/daemon/client.js.map +1 -1
  151. package/dist/daemon/manager.d.ts +46 -12
  152. package/dist/daemon/manager.d.ts.map +1 -1
  153. package/dist/daemon/manager.js +102 -61
  154. package/dist/daemon/manager.js.map +1 -1
  155. package/dist/daemon/protocol.d.ts +74 -6
  156. package/dist/daemon/protocol.d.ts.map +1 -1
  157. package/dist/daemon/protocol.js +76 -1
  158. package/dist/daemon/protocol.js.map +1 -1
  159. package/dist/daemon/server.d.ts +6 -6
  160. package/dist/daemon/server.js +778 -117
  161. package/dist/daemon/server.js.map +1 -1
  162. package/dist/daemon/session-manager.d.ts +8 -1
  163. package/dist/daemon/session-manager.d.ts.map +1 -1
  164. package/dist/daemon/session-manager.js +32 -9
  165. package/dist/daemon/session-manager.js.map +1 -1
  166. package/dist/deploy/cloudflare.d.ts +12 -0
  167. package/dist/deploy/cloudflare.d.ts.map +1 -0
  168. package/dist/deploy/cloudflare.js +216 -0
  169. package/dist/deploy/cloudflare.js.map +1 -0
  170. package/dist/index.d.ts +1 -0
  171. package/dist/index.d.ts.map +1 -1
  172. package/dist/index.js +3 -0
  173. package/dist/index.js.map +1 -1
  174. package/dist/loader.d.ts +172 -15
  175. package/dist/loader.d.ts.map +1 -1
  176. package/dist/loader.js +1132 -267
  177. package/dist/loader.js.map +1 -1
  178. package/dist/markdown-utils.d.ts +8 -0
  179. package/dist/markdown-utils.d.ts.map +1 -0
  180. package/dist/markdown-utils.js +63 -0
  181. package/dist/markdown-utils.js.map +1 -0
  182. package/dist/marketplace-manager.d.ts +10 -0
  183. package/dist/marketplace-manager.d.ts.map +1 -1
  184. package/dist/marketplace-manager.js +112 -28
  185. package/dist/marketplace-manager.js.map +1 -1
  186. package/dist/mcp-client.d.ts +9 -0
  187. package/dist/mcp-client.d.ts.map +1 -0
  188. package/dist/mcp-client.js +11 -0
  189. package/dist/mcp-client.js.map +1 -0
  190. package/dist/mcp-elicitation.d.ts +32 -0
  191. package/dist/mcp-elicitation.d.ts.map +1 -0
  192. package/dist/mcp-elicitation.js +26 -0
  193. package/dist/mcp-elicitation.js.map +1 -0
  194. package/dist/path-resolver.d.ts +9 -12
  195. package/dist/path-resolver.d.ts.map +1 -1
  196. package/dist/path-resolver.js +13 -43
  197. package/dist/path-resolver.js.map +1 -1
  198. package/dist/photon-cli-runner.d.ts.map +1 -1
  199. package/dist/photon-cli-runner.js +216 -73
  200. package/dist/photon-cli-runner.js.map +1 -1
  201. package/dist/photon-doc-extractor.d.ts +88 -0
  202. package/dist/photon-doc-extractor.d.ts.map +1 -1
  203. package/dist/photon-doc-extractor.js +536 -27
  204. package/dist/photon-doc-extractor.js.map +1 -1
  205. package/dist/photons/maker.photon.d.ts +182 -0
  206. package/dist/photons/maker.photon.d.ts.map +1 -0
  207. package/dist/photons/maker.photon.js +504 -0
  208. package/dist/photons/maker.photon.js.map +1 -0
  209. package/dist/photons/maker.photon.ts +626 -0
  210. package/dist/photons/marketplace.photon.d.ts +110 -0
  211. package/dist/photons/marketplace.photon.d.ts.map +1 -0
  212. package/dist/photons/marketplace.photon.js +260 -0
  213. package/dist/photons/marketplace.photon.js.map +1 -0
  214. package/dist/photons/marketplace.photon.ts +378 -0
  215. package/dist/photons/tunnel.photon.d.ts +80 -0
  216. package/dist/photons/tunnel.photon.d.ts.map +1 -0
  217. package/dist/photons/tunnel.photon.js +269 -0
  218. package/dist/photons/tunnel.photon.js.map +1 -0
  219. package/dist/photons/tunnel.photon.ts +345 -0
  220. package/dist/security-scanner.d.ts.map +1 -1
  221. package/dist/security-scanner.js +18 -15
  222. package/dist/security-scanner.js.map +1 -1
  223. package/dist/serv/auth/jwt.d.ts +89 -0
  224. package/dist/serv/auth/jwt.d.ts.map +1 -0
  225. package/dist/serv/auth/jwt.js +239 -0
  226. package/dist/serv/auth/jwt.js.map +1 -0
  227. package/dist/serv/auth/oauth.d.ts +117 -0
  228. package/dist/serv/auth/oauth.d.ts.map +1 -0
  229. package/dist/serv/auth/oauth.js +395 -0
  230. package/dist/serv/auth/oauth.js.map +1 -0
  231. package/dist/serv/auth/well-known.d.ts +60 -0
  232. package/dist/serv/auth/well-known.d.ts.map +1 -0
  233. package/dist/serv/auth/well-known.js +154 -0
  234. package/dist/serv/auth/well-known.js.map +1 -0
  235. package/dist/serv/db/d1-client.d.ts +65 -0
  236. package/dist/serv/db/d1-client.d.ts.map +1 -0
  237. package/dist/serv/db/d1-client.js +137 -0
  238. package/dist/serv/db/d1-client.js.map +1 -0
  239. package/dist/serv/db/d1-stores.d.ts +62 -0
  240. package/dist/serv/db/d1-stores.d.ts.map +1 -0
  241. package/dist/serv/db/d1-stores.js +307 -0
  242. package/dist/serv/db/d1-stores.js.map +1 -0
  243. package/dist/serv/index.d.ts +114 -0
  244. package/dist/serv/index.d.ts.map +1 -0
  245. package/dist/serv/index.js +172 -0
  246. package/dist/serv/index.js.map +1 -0
  247. package/dist/serv/local.d.ts +118 -0
  248. package/dist/serv/local.d.ts.map +1 -0
  249. package/dist/serv/local.js +392 -0
  250. package/dist/serv/local.js.map +1 -0
  251. package/dist/serv/middleware/auth.d.ts +66 -0
  252. package/dist/serv/middleware/auth.d.ts.map +1 -0
  253. package/dist/serv/middleware/auth.js +178 -0
  254. package/dist/serv/middleware/auth.js.map +1 -0
  255. package/dist/serv/middleware/tenant.d.ts +94 -0
  256. package/dist/serv/middleware/tenant.d.ts.map +1 -0
  257. package/dist/serv/middleware/tenant.js +152 -0
  258. package/dist/serv/middleware/tenant.js.map +1 -0
  259. package/dist/serv/runtime/executor.d.ts +76 -0
  260. package/dist/serv/runtime/executor.d.ts.map +1 -0
  261. package/dist/serv/runtime/executor.js +105 -0
  262. package/dist/serv/runtime/executor.js.map +1 -0
  263. package/dist/serv/runtime/index.d.ts +8 -0
  264. package/dist/serv/runtime/index.d.ts.map +1 -0
  265. package/dist/serv/runtime/index.js +10 -0
  266. package/dist/serv/runtime/index.js.map +1 -0
  267. package/dist/serv/runtime/oauth-context.d.ts +121 -0
  268. package/dist/serv/runtime/oauth-context.d.ts.map +1 -0
  269. package/dist/serv/runtime/oauth-context.js +153 -0
  270. package/dist/serv/runtime/oauth-context.js.map +1 -0
  271. package/dist/serv/session/kv-store.d.ts +54 -0
  272. package/dist/serv/session/kv-store.d.ts.map +1 -0
  273. package/dist/serv/session/kv-store.js +149 -0
  274. package/dist/serv/session/kv-store.js.map +1 -0
  275. package/dist/serv/session/store.d.ts +113 -0
  276. package/dist/serv/session/store.d.ts.map +1 -0
  277. package/dist/serv/session/store.js +284 -0
  278. package/dist/serv/session/store.js.map +1 -0
  279. package/dist/serv/types/index.d.ts +147 -0
  280. package/dist/serv/types/index.d.ts.map +1 -0
  281. package/dist/serv/types/index.js +8 -0
  282. package/dist/serv/types/index.js.map +1 -0
  283. package/dist/serv/vault/token-vault.d.ts +102 -0
  284. package/dist/serv/vault/token-vault.d.ts.map +1 -0
  285. package/dist/serv/vault/token-vault.js +177 -0
  286. package/dist/serv/vault/token-vault.js.map +1 -0
  287. package/dist/server.d.ts +173 -0
  288. package/dist/server.d.ts.map +1 -1
  289. package/dist/server.js +1622 -86
  290. package/dist/server.js.map +1 -1
  291. package/dist/shared/cli-sections.d.ts +6 -0
  292. package/dist/shared/cli-sections.d.ts.map +1 -0
  293. package/dist/shared/cli-sections.js +16 -0
  294. package/dist/shared/cli-sections.js.map +1 -0
  295. package/dist/shared/cli-utils.d.ts +81 -0
  296. package/dist/shared/cli-utils.d.ts.map +1 -0
  297. package/dist/shared/cli-utils.js +174 -0
  298. package/dist/shared/cli-utils.js.map +1 -0
  299. package/dist/shared/config-docs.d.ts +6 -0
  300. package/dist/shared/config-docs.d.ts.map +1 -0
  301. package/dist/shared/config-docs.js +6 -0
  302. package/dist/shared/config-docs.js.map +1 -0
  303. package/dist/shared/error-handler.d.ts +128 -0
  304. package/dist/shared/error-handler.d.ts.map +1 -0
  305. package/dist/shared/error-handler.js +342 -0
  306. package/dist/shared/error-handler.js.map +1 -0
  307. package/dist/shared/logger.d.ts +42 -0
  308. package/dist/shared/logger.d.ts.map +1 -0
  309. package/dist/shared/logger.js +123 -0
  310. package/dist/shared/logger.js.map +1 -0
  311. package/dist/shared/performance.d.ts +65 -0
  312. package/dist/shared/performance.d.ts.map +1 -0
  313. package/dist/shared/performance.js +136 -0
  314. package/dist/shared/performance.js.map +1 -0
  315. package/dist/shared/task-runner.d.ts +2 -0
  316. package/dist/shared/task-runner.d.ts.map +1 -0
  317. package/dist/shared/task-runner.js +16 -0
  318. package/dist/shared/task-runner.js.map +1 -0
  319. package/dist/shared/validation.d.ts +6 -0
  320. package/dist/shared/validation.d.ts.map +1 -0
  321. package/dist/shared/validation.js +6 -0
  322. package/dist/shared/validation.js.map +1 -0
  323. package/dist/shared-utils.d.ts +63 -0
  324. package/dist/shared-utils.d.ts.map +1 -0
  325. package/dist/shared-utils.js +123 -0
  326. package/dist/shared-utils.js.map +1 -0
  327. package/dist/template-manager.d.ts +23 -2
  328. package/dist/template-manager.d.ts.map +1 -1
  329. package/dist/template-manager.js +177 -88
  330. package/dist/template-manager.js.map +1 -1
  331. package/dist/test-client.d.ts.map +1 -1
  332. package/dist/test-client.js +10 -8
  333. package/dist/test-client.js.map +1 -1
  334. package/dist/test-runner.d.ts +52 -0
  335. package/dist/test-runner.d.ts.map +1 -0
  336. package/dist/test-runner.js +785 -0
  337. package/dist/test-runner.js.map +1 -0
  338. package/dist/testing.d.ts +103 -0
  339. package/dist/testing.d.ts.map +1 -0
  340. package/dist/testing.js +163 -0
  341. package/dist/testing.js.map +1 -0
  342. package/dist/version-checker.d.ts.map +1 -1
  343. package/dist/version-checker.js +2 -2
  344. package/dist/version-checker.js.map +1 -1
  345. package/dist/version.d.ts +2 -0
  346. package/dist/version.d.ts.map +1 -0
  347. package/dist/version.js +5 -0
  348. package/dist/version.js.map +1 -0
  349. package/dist/watcher.d.ts +6 -3
  350. package/dist/watcher.d.ts.map +1 -1
  351. package/dist/watcher.js +49 -10
  352. package/dist/watcher.js.map +1 -1
  353. package/package.json +47 -7
  354. package/templates/cloudflare/worker.ts.template +381 -0
  355. package/templates/cloudflare/wrangler.toml.template +9 -0
  356. package/dist/base.d.ts +0 -58
  357. package/dist/base.d.ts.map +0 -1
  358. package/dist/base.js +0 -92
  359. package/dist/base.js.map +0 -1
  360. package/dist/dependency-manager.d.ts +0 -49
  361. package/dist/dependency-manager.d.ts.map +0 -1
  362. package/dist/dependency-manager.js +0 -165
  363. package/dist/dependency-manager.js.map +0 -1
  364. package/dist/registry-manager.d.ts +0 -76
  365. package/dist/registry-manager.d.ts.map +0 -1
  366. package/dist/registry-manager.js +0 -220
  367. package/dist/registry-manager.js.map +0 -1
  368. package/dist/schema-extractor.d.ts +0 -110
  369. package/dist/schema-extractor.d.ts.map +0 -1
  370. package/dist/schema-extractor.js +0 -727
  371. package/dist/schema-extractor.js.map +0 -1
  372. package/dist/test-marketplace-sources.d.ts +0 -5
  373. package/dist/test-marketplace-sources.d.ts.map +0 -1
  374. package/dist/test-marketplace-sources.js +0 -53
  375. package/dist/test-marketplace-sources.js.map +0 -1
  376. package/dist/types.d.ts +0 -109
  377. package/dist/types.d.ts.map +0 -1
  378. package/dist/types.js +0 -12
  379. package/dist/types.js.map +0 -1
@@ -3,18 +3,40 @@
3
3
  *
4
4
  * CLI client for communicating with daemon servers
5
5
  * Sends commands via Unix socket / named pipe and receives results
6
+ * Supports bidirectional prompts - daemon can request user input
6
7
  */
7
8
  import * as net from 'net';
8
9
  import * as crypto from 'crypto';
9
- import { getSocketPath } from './manager.js';
10
+ import * as readline from 'readline';
11
+ import { getGlobalSocketPath } from './manager.js';
12
+ import { createLogger } from '../shared/logger.js';
13
+ import { getErrorMessage } from '../shared/error-handler.js';
10
14
  // Generate session ID for this process
11
15
  // This ensures all commands from the same terminal session share the same photon instance
12
16
  const SESSION_ID = process.env.PHOTON_SESSION_ID || `cli-${process.pid}-${crypto.randomBytes(4).toString('hex')}`;
17
+ const logger = createLogger({ component: 'daemon-client', minimal: true });
18
+ /**
19
+ * Prompt user for input using readline
20
+ */
21
+ async function promptUser(message, defaultValue) {
22
+ return new Promise((resolve) => {
23
+ const rl = readline.createInterface({
24
+ input: process.stdin,
25
+ output: process.stdout,
26
+ });
27
+ const prompt = defaultValue ? `${message} [${defaultValue}]: ` : `${message}: `;
28
+ rl.question(prompt, (answer) => {
29
+ rl.close();
30
+ resolve(answer || defaultValue || null);
31
+ });
32
+ });
33
+ }
13
34
  /**
14
35
  * Send command to daemon and wait for response
36
+ * Handles bidirectional prompts - if daemon requests input, uses readline
15
37
  */
16
38
  export async function sendCommand(photonName, method, args) {
17
- const socketPath = getSocketPath(photonName);
39
+ const socketPath = getGlobalSocketPath();
18
40
  const requestId = `req_${Date.now()}_${Math.random()}`;
19
41
  return new Promise((resolve, reject) => {
20
42
  const client = net.createConnection(socketPath);
@@ -25,11 +47,12 @@ export async function sendCommand(photonName, method, args) {
25
47
  client.destroy();
26
48
  reject(new Error('Request timeout'));
27
49
  }
28
- }, 30000); // 30 second timeout
50
+ }, 120000); // 2 minute timeout (longer for interactive prompts)
29
51
  client.on('connect', () => {
30
52
  const request = {
31
53
  type: 'command',
32
54
  id: requestId,
55
+ photonName,
33
56
  sessionId: SESSION_ID,
34
57
  clientType: 'cli',
35
58
  method,
@@ -37,7 +60,7 @@ export async function sendCommand(photonName, method, args) {
37
60
  };
38
61
  client.write(JSON.stringify(request) + '\n');
39
62
  });
40
- client.on('data', (chunk) => {
63
+ client.on('data', async (chunk) => {
41
64
  buffer += chunk.toString();
42
65
  // Process complete JSON messages (newline-delimited)
43
66
  const lines = buffer.split('\n');
@@ -48,27 +71,52 @@ export async function sendCommand(photonName, method, args) {
48
71
  try {
49
72
  const response = JSON.parse(line);
50
73
  if (response.id === requestId) {
51
- responseReceived = true;
52
- clearTimeout(timeout);
53
- if (response.type === 'error') {
54
- client.destroy();
55
- reject(new Error(response.error || 'Unknown error'));
74
+ // Handle prompt request from daemon
75
+ if (response.type === 'prompt' && response.prompt) {
76
+ // Reset timeout while waiting for user input
77
+ clearTimeout(timeout);
78
+ // Get user input via readline
79
+ const userInput = await promptUser(response.prompt.message, response.prompt.default);
80
+ // Send prompt response back to daemon
81
+ const promptResponse = {
82
+ type: 'prompt_response',
83
+ id: requestId,
84
+ promptValue: userInput,
85
+ };
86
+ client.write(JSON.stringify(promptResponse) + '\n');
87
+ // Restart timeout for next response
88
+ setTimeout(() => {
89
+ if (!responseReceived) {
90
+ client.destroy();
91
+ reject(new Error('Request timeout'));
92
+ }
93
+ }, 120000);
56
94
  }
57
- else {
95
+ // Handle final result
96
+ else if (response.type === 'result') {
97
+ responseReceived = true;
98
+ clearTimeout(timeout);
58
99
  client.destroy();
59
100
  resolve(response.data);
60
101
  }
102
+ // Handle error
103
+ else if (response.type === 'error') {
104
+ responseReceived = true;
105
+ clearTimeout(timeout);
106
+ client.destroy();
107
+ reject(new Error(response.error || 'Unknown error'));
108
+ }
61
109
  }
62
110
  }
63
111
  catch (error) {
64
- console.error(`[daemon-client] Error parsing response: ${error.message}`);
112
+ logger.warn('Failed to parse daemon response', { error: getErrorMessage(error) });
65
113
  }
66
114
  }
67
115
  });
68
116
  client.on('error', (error) => {
69
117
  clearTimeout(timeout);
70
118
  client.destroy();
71
- reject(new Error(`Connection error: ${error.message}`));
119
+ reject(new Error(`Connection error: ${getErrorMessage(error)}`));
72
120
  });
73
121
  client.on('end', () => {
74
122
  clearTimeout(timeout);
@@ -79,11 +127,480 @@ export async function sendCommand(photonName, method, args) {
79
127
  });
80
128
  });
81
129
  }
130
+ /**
131
+ * Subscribe to a channel on a daemon
132
+ * Returns an unsubscribe function
133
+ */
134
+ export async function subscribeChannel(photonName, channel, handler, options) {
135
+ const socketPath = getGlobalSocketPath();
136
+ const subscribeId = `sub_${Date.now()}_${Math.random().toString(36).slice(2)}`;
137
+ return new Promise((resolve, reject) => {
138
+ const client = net.createConnection(socketPath);
139
+ let subscribed = false;
140
+ let buffer = '';
141
+ client.on('connect', () => {
142
+ // Send subscribe request
143
+ const request = {
144
+ type: 'subscribe',
145
+ id: subscribeId,
146
+ photonName,
147
+ channel,
148
+ clientType: 'beam',
149
+ lastEventId: options?.lastEventId,
150
+ };
151
+ client.write(JSON.stringify(request) + '\n');
152
+ });
153
+ client.on('data', (chunk) => {
154
+ buffer += chunk.toString();
155
+ // Process complete JSON messages (newline-delimited)
156
+ const lines = buffer.split('\n');
157
+ buffer = lines.pop() || '';
158
+ for (const line of lines) {
159
+ if (!line.trim())
160
+ continue;
161
+ try {
162
+ const response = JSON.parse(line);
163
+ // Handle subscription confirmation
164
+ if (response.id === subscribeId && response.type === 'result') {
165
+ subscribed = true;
166
+ // Return unsubscribe function
167
+ resolve(() => {
168
+ if (!client.destroyed) {
169
+ const unsubRequest = {
170
+ type: 'unsubscribe',
171
+ id: `unsub_${Date.now()}`,
172
+ photonName,
173
+ channel,
174
+ };
175
+ client.write(JSON.stringify(unsubRequest) + '\n');
176
+ client.end();
177
+ }
178
+ });
179
+ }
180
+ // Handle refresh-needed signal (lastEventId too old)
181
+ if (response.type === 'refresh_needed') {
182
+ if (options?.onRefreshNeeded) {
183
+ options.onRefreshNeeded();
184
+ }
185
+ }
186
+ // Handle channel messages (supports wildcard subscriptions)
187
+ if (response.type === 'channel_message' && response.channel) {
188
+ const isMatch = channel.endsWith(':*')
189
+ ? response.channel.startsWith(channel.slice(0, -1)) // "kanban:*" matches "kanban:anything"
190
+ : response.channel === channel; // exact match
191
+ if (isMatch) {
192
+ handler(response.message, response.eventId);
193
+ }
194
+ }
195
+ // Handle errors
196
+ if (response.type === 'error' && response.id === subscribeId) {
197
+ reject(new Error(response.error || 'Subscription failed'));
198
+ }
199
+ }
200
+ catch {
201
+ // Ignore parse errors for partial messages
202
+ }
203
+ }
204
+ });
205
+ client.on('error', (error) => {
206
+ if (!subscribed) {
207
+ reject(new Error(`Connection error: ${getErrorMessage(error)}`));
208
+ }
209
+ });
210
+ client.on('end', () => {
211
+ if (!subscribed) {
212
+ reject(new Error('Connection closed before subscription confirmed'));
213
+ }
214
+ });
215
+ });
216
+ }
217
+ /**
218
+ * Publish a message to a channel on a daemon
219
+ */
220
+ export async function publishToChannel(photonName, channel, message) {
221
+ const socketPath = getGlobalSocketPath();
222
+ const requestId = `pub_${Date.now()}_${Math.random().toString(36).slice(2)}`;
223
+ return new Promise((resolve, reject) => {
224
+ const client = net.createConnection(socketPath);
225
+ const timeout = setTimeout(() => {
226
+ client.destroy();
227
+ reject(new Error('Publish timeout'));
228
+ }, 5000);
229
+ client.on('connect', () => {
230
+ const request = {
231
+ type: 'publish',
232
+ id: requestId,
233
+ photonName,
234
+ channel,
235
+ message,
236
+ };
237
+ client.write(JSON.stringify(request) + '\n');
238
+ });
239
+ client.on('data', (chunk) => {
240
+ try {
241
+ const response = JSON.parse(chunk.toString().trim());
242
+ if (response.id === requestId) {
243
+ clearTimeout(timeout);
244
+ client.destroy();
245
+ if (response.type === 'result') {
246
+ resolve();
247
+ }
248
+ else {
249
+ reject(new Error(response.error || 'Publish failed'));
250
+ }
251
+ }
252
+ }
253
+ catch {
254
+ // Ignore parse errors
255
+ }
256
+ });
257
+ client.on('error', (error) => {
258
+ clearTimeout(timeout);
259
+ client.destroy();
260
+ reject(new Error(`Connection error: ${getErrorMessage(error)}`));
261
+ });
262
+ });
263
+ }
264
+ /**
265
+ * Acquire a distributed lock
266
+ * Returns true if lock acquired, false if already held
267
+ */
268
+ export async function acquireLock(photonName, lockName, timeout) {
269
+ const socketPath = getGlobalSocketPath();
270
+ const requestId = `lock_${Date.now()}_${Math.random().toString(36).slice(2)}`;
271
+ return new Promise((resolve, reject) => {
272
+ const client = net.createConnection(socketPath);
273
+ const requestTimeout = setTimeout(() => {
274
+ client.destroy();
275
+ reject(new Error('Lock request timeout'));
276
+ }, 10000);
277
+ client.on('connect', () => {
278
+ const request = {
279
+ type: 'lock',
280
+ id: requestId,
281
+ photonName,
282
+ sessionId: SESSION_ID,
283
+ lockName,
284
+ lockTimeout: timeout,
285
+ };
286
+ client.write(JSON.stringify(request) + '\n');
287
+ });
288
+ client.on('data', (chunk) => {
289
+ try {
290
+ const response = JSON.parse(chunk.toString().trim());
291
+ if (response.id === requestId) {
292
+ clearTimeout(requestTimeout);
293
+ client.destroy();
294
+ if (response.type === 'result') {
295
+ resolve(response.data.acquired);
296
+ }
297
+ else {
298
+ reject(new Error(response.error || 'Lock failed'));
299
+ }
300
+ }
301
+ }
302
+ catch {
303
+ // Ignore parse errors
304
+ }
305
+ });
306
+ client.on('error', (error) => {
307
+ clearTimeout(requestTimeout);
308
+ client.destroy();
309
+ reject(new Error(`Connection error: ${getErrorMessage(error)}`));
310
+ });
311
+ });
312
+ }
313
+ /**
314
+ * Release a distributed lock
315
+ * Returns true if lock released, false if not held by this session
316
+ */
317
+ export async function releaseLock(photonName, lockName) {
318
+ const socketPath = getGlobalSocketPath();
319
+ const requestId = `unlock_${Date.now()}_${Math.random().toString(36).slice(2)}`;
320
+ return new Promise((resolve, reject) => {
321
+ const client = net.createConnection(socketPath);
322
+ const timeout = setTimeout(() => {
323
+ client.destroy();
324
+ reject(new Error('Unlock request timeout'));
325
+ }, 5000);
326
+ client.on('connect', () => {
327
+ const request = {
328
+ type: 'unlock',
329
+ id: requestId,
330
+ photonName,
331
+ sessionId: SESSION_ID,
332
+ lockName,
333
+ };
334
+ client.write(JSON.stringify(request) + '\n');
335
+ });
336
+ client.on('data', (chunk) => {
337
+ try {
338
+ const response = JSON.parse(chunk.toString().trim());
339
+ if (response.id === requestId) {
340
+ clearTimeout(timeout);
341
+ client.destroy();
342
+ if (response.type === 'result') {
343
+ resolve(response.data.released);
344
+ }
345
+ else {
346
+ reject(new Error(response.error || 'Unlock failed'));
347
+ }
348
+ }
349
+ }
350
+ catch {
351
+ // Ignore parse errors
352
+ }
353
+ });
354
+ client.on('error', (error) => {
355
+ clearTimeout(timeout);
356
+ client.destroy();
357
+ reject(new Error(`Connection error: ${getErrorMessage(error)}`));
358
+ });
359
+ });
360
+ }
361
+ /**
362
+ * List all active locks
363
+ */
364
+ export async function listLocks(photonName) {
365
+ const socketPath = getGlobalSocketPath();
366
+ const requestId = `listlocks_${Date.now()}_${Math.random().toString(36).slice(2)}`;
367
+ return new Promise((resolve, reject) => {
368
+ const client = net.createConnection(socketPath);
369
+ const timeout = setTimeout(() => {
370
+ client.destroy();
371
+ reject(new Error('List locks request timeout'));
372
+ }, 5000);
373
+ client.on('connect', () => {
374
+ const request = {
375
+ type: 'list_locks',
376
+ id: requestId,
377
+ photonName,
378
+ };
379
+ client.write(JSON.stringify(request) + '\n');
380
+ });
381
+ client.on('data', (chunk) => {
382
+ try {
383
+ const response = JSON.parse(chunk.toString().trim());
384
+ if (response.id === requestId) {
385
+ clearTimeout(timeout);
386
+ client.destroy();
387
+ if (response.type === 'result') {
388
+ resolve(response.data.locks || []);
389
+ }
390
+ else {
391
+ reject(new Error(response.error || 'List locks failed'));
392
+ }
393
+ }
394
+ }
395
+ catch {
396
+ // Ignore parse errors
397
+ }
398
+ });
399
+ client.on('error', (error) => {
400
+ clearTimeout(timeout);
401
+ client.destroy();
402
+ reject(new Error(`Connection error: ${getErrorMessage(error)}`));
403
+ });
404
+ });
405
+ }
406
+ /**
407
+ * Schedule a recurring job
408
+ */
409
+ export async function scheduleJob(photonName, jobId, method, cron, args) {
410
+ const socketPath = getGlobalSocketPath();
411
+ const requestId = `schedule_${Date.now()}_${Math.random().toString(36).slice(2)}`;
412
+ return new Promise((resolve, reject) => {
413
+ const client = net.createConnection(socketPath);
414
+ const timeout = setTimeout(() => {
415
+ client.destroy();
416
+ reject(new Error('Schedule request timeout'));
417
+ }, 5000);
418
+ client.on('connect', () => {
419
+ const request = {
420
+ type: 'schedule',
421
+ id: requestId,
422
+ photonName,
423
+ sessionId: SESSION_ID,
424
+ jobId,
425
+ method,
426
+ cron,
427
+ args,
428
+ };
429
+ client.write(JSON.stringify(request) + '\n');
430
+ });
431
+ client.on('data', (chunk) => {
432
+ try {
433
+ const response = JSON.parse(chunk.toString().trim());
434
+ if (response.id === requestId) {
435
+ clearTimeout(timeout);
436
+ client.destroy();
437
+ if (response.type === 'result') {
438
+ resolve(response.data);
439
+ }
440
+ else {
441
+ reject(new Error(response.error || 'Schedule failed'));
442
+ }
443
+ }
444
+ }
445
+ catch {
446
+ // Ignore parse errors
447
+ }
448
+ });
449
+ client.on('error', (error) => {
450
+ clearTimeout(timeout);
451
+ client.destroy();
452
+ reject(new Error(`Connection error: ${getErrorMessage(error)}`));
453
+ });
454
+ });
455
+ }
456
+ /**
457
+ * Unschedule a job
458
+ */
459
+ export async function unscheduleJob(photonName, jobId) {
460
+ const socketPath = getGlobalSocketPath();
461
+ const requestId = `unschedule_${Date.now()}_${Math.random().toString(36).slice(2)}`;
462
+ return new Promise((resolve, reject) => {
463
+ const client = net.createConnection(socketPath);
464
+ const timeout = setTimeout(() => {
465
+ client.destroy();
466
+ reject(new Error('Unschedule request timeout'));
467
+ }, 5000);
468
+ client.on('connect', () => {
469
+ const request = {
470
+ type: 'unschedule',
471
+ id: requestId,
472
+ photonName,
473
+ jobId,
474
+ };
475
+ client.write(JSON.stringify(request) + '\n');
476
+ });
477
+ client.on('data', (chunk) => {
478
+ try {
479
+ const response = JSON.parse(chunk.toString().trim());
480
+ if (response.id === requestId) {
481
+ clearTimeout(timeout);
482
+ client.destroy();
483
+ if (response.type === 'result') {
484
+ resolve(response.data.unscheduled);
485
+ }
486
+ else {
487
+ reject(new Error(response.error || 'Unschedule failed'));
488
+ }
489
+ }
490
+ }
491
+ catch {
492
+ // Ignore parse errors
493
+ }
494
+ });
495
+ client.on('error', (error) => {
496
+ clearTimeout(timeout);
497
+ client.destroy();
498
+ reject(new Error(`Connection error: ${getErrorMessage(error)}`));
499
+ });
500
+ });
501
+ }
502
+ /**
503
+ * List all scheduled jobs
504
+ */
505
+ export async function listJobs(photonName) {
506
+ const socketPath = getGlobalSocketPath();
507
+ const requestId = `listjobs_${Date.now()}_${Math.random().toString(36).slice(2)}`;
508
+ return new Promise((resolve, reject) => {
509
+ const client = net.createConnection(socketPath);
510
+ const timeout = setTimeout(() => {
511
+ client.destroy();
512
+ reject(new Error('List jobs request timeout'));
513
+ }, 5000);
514
+ client.on('connect', () => {
515
+ const request = {
516
+ type: 'list_jobs',
517
+ id: requestId,
518
+ photonName,
519
+ };
520
+ client.write(JSON.stringify(request) + '\n');
521
+ });
522
+ client.on('data', (chunk) => {
523
+ try {
524
+ const response = JSON.parse(chunk.toString().trim());
525
+ if (response.id === requestId) {
526
+ clearTimeout(timeout);
527
+ client.destroy();
528
+ if (response.type === 'result') {
529
+ resolve(response.data.jobs || []);
530
+ }
531
+ else {
532
+ reject(new Error(response.error || 'List jobs failed'));
533
+ }
534
+ }
535
+ }
536
+ catch {
537
+ // Ignore parse errors
538
+ }
539
+ });
540
+ client.on('error', (error) => {
541
+ clearTimeout(timeout);
542
+ client.destroy();
543
+ reject(new Error(`Connection error: ${getErrorMessage(error)}`));
544
+ });
545
+ });
546
+ }
547
+ /**
548
+ * Reload the daemon's photon code without losing state
549
+ * Called by dev server after hot-reload to sync daemon
550
+ */
551
+ export async function reloadDaemon(photonName, photonPath) {
552
+ const socketPath = getGlobalSocketPath();
553
+ const requestId = `reload_${Date.now()}_${Math.random().toString(36).slice(2)}`;
554
+ return new Promise((resolve, reject) => {
555
+ const client = net.createConnection(socketPath);
556
+ const timeout = setTimeout(() => {
557
+ client.destroy();
558
+ reject(new Error('Reload request timeout'));
559
+ }, 30000); // 30 second timeout for reload
560
+ client.on('connect', () => {
561
+ const request = {
562
+ type: 'reload',
563
+ id: requestId,
564
+ photonName,
565
+ photonPath,
566
+ };
567
+ client.write(JSON.stringify(request) + '\n');
568
+ });
569
+ client.on('data', (chunk) => {
570
+ try {
571
+ const response = JSON.parse(chunk.toString().trim());
572
+ if (response.id === requestId) {
573
+ clearTimeout(timeout);
574
+ client.destroy();
575
+ if (response.type === 'result') {
576
+ const data = response.data;
577
+ resolve({
578
+ success: response.success ?? true,
579
+ error: data?.error,
580
+ sessionsUpdated: data?.sessionsUpdated,
581
+ });
582
+ }
583
+ else {
584
+ resolve({ success: false, error: response.error || 'Reload failed' });
585
+ }
586
+ }
587
+ }
588
+ catch {
589
+ // Ignore parse errors
590
+ }
591
+ });
592
+ client.on('error', (error) => {
593
+ clearTimeout(timeout);
594
+ client.destroy();
595
+ reject(new Error(`Connection error: ${getErrorMessage(error)}`));
596
+ });
597
+ });
598
+ }
82
599
  /**
83
600
  * Ping daemon to check if it's responsive
84
601
  */
85
602
  export async function pingDaemon(photonName) {
86
- const socketPath = getSocketPath(photonName);
603
+ const socketPath = getGlobalSocketPath();
87
604
  const requestId = `ping_${Date.now()}`;
88
605
  return new Promise((resolve) => {
89
606
  const client = net.createConnection(socketPath);
@@ -95,6 +612,7 @@ export async function pingDaemon(photonName) {
95
612
  const request = {
96
613
  type: 'ping',
97
614
  id: requestId,
615
+ photonName,
98
616
  };
99
617
  client.write(JSON.stringify(request) + '\n');
100
618
  });
@@ -123,4 +641,56 @@ export async function pingDaemon(photonName) {
123
641
  });
124
642
  });
125
643
  }
644
+ /**
645
+ * Get events since a specific eventId for a channel
646
+ * Used for explicit replay when client has missed events
647
+ */
648
+ export async function getEventsSince(photonName, channel, lastEventId) {
649
+ const socketPath = getGlobalSocketPath();
650
+ const requestId = `getevents_${Date.now()}_${Math.random().toString(36).slice(2)}`;
651
+ return new Promise((resolve, reject) => {
652
+ const client = net.createConnection(socketPath);
653
+ const timeout = setTimeout(() => {
654
+ client.destroy();
655
+ reject(new Error('Get events request timeout'));
656
+ }, 5000);
657
+ client.on('connect', () => {
658
+ const request = {
659
+ type: 'get_events_since',
660
+ id: requestId,
661
+ photonName,
662
+ channel,
663
+ lastEventId,
664
+ };
665
+ client.write(JSON.stringify(request) + '\n');
666
+ });
667
+ client.on('data', (chunk) => {
668
+ try {
669
+ const response = JSON.parse(chunk.toString().trim());
670
+ if (response.id === requestId) {
671
+ clearTimeout(timeout);
672
+ client.destroy();
673
+ if (response.type === 'result') {
674
+ const data = response.data;
675
+ resolve({
676
+ events: data.events || [],
677
+ refreshNeeded: data.refreshNeeded || false,
678
+ });
679
+ }
680
+ else {
681
+ reject(new Error(response.error || 'Get events failed'));
682
+ }
683
+ }
684
+ }
685
+ catch {
686
+ // Ignore parse errors
687
+ }
688
+ });
689
+ client.on('error', (error) => {
690
+ clearTimeout(timeout);
691
+ client.destroy();
692
+ reject(new Error(`Connection error: ${getErrorMessage(error)}`));
693
+ });
694
+ });
695
+ }
126
696
  //# sourceMappingURL=client.js.map