@wasmsoft/fantastic 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (456) hide show
  1. package/README.md +65 -0
  2. package/bin/run.js +27 -0
  3. package/bin/supervisor.js +65 -0
  4. package/dist/acquire/central-url.d.ts +9 -0
  5. package/dist/acquire/central-url.d.ts.map +1 -0
  6. package/dist/acquire/central-url.js +74 -0
  7. package/dist/acquire/central-url.js.map +1 -0
  8. package/dist/acquire/code.d.ts +21 -0
  9. package/dist/acquire/code.d.ts.map +1 -0
  10. package/dist/acquire/code.js +66 -0
  11. package/dist/acquire/code.js.map +1 -0
  12. package/dist/acquire/compatibility.d.ts +18 -0
  13. package/dist/acquire/compatibility.d.ts.map +1 -0
  14. package/dist/acquire/compatibility.js +36 -0
  15. package/dist/acquire/compatibility.js.map +1 -0
  16. package/dist/acquire/fetch.d.ts +26 -0
  17. package/dist/acquire/fetch.d.ts.map +1 -0
  18. package/dist/acquire/fetch.js +72 -0
  19. package/dist/acquire/fetch.js.map +1 -0
  20. package/dist/acquire/latest.d.ts +24 -0
  21. package/dist/acquire/latest.d.ts.map +1 -0
  22. package/dist/acquire/latest.js +95 -0
  23. package/dist/acquire/latest.js.map +1 -0
  24. package/dist/backup/archive.d.ts +26 -0
  25. package/dist/backup/archive.d.ts.map +1 -0
  26. package/dist/backup/archive.js +123 -0
  27. package/dist/backup/archive.js.map +1 -0
  28. package/dist/backup/restore.d.ts +46 -0
  29. package/dist/backup/restore.d.ts.map +1 -0
  30. package/dist/backup/restore.js +164 -0
  31. package/dist/backup/restore.js.map +1 -0
  32. package/dist/base-command.d.ts +54 -0
  33. package/dist/base-command.d.ts.map +1 -0
  34. package/dist/base-command.js +120 -0
  35. package/dist/base-command.js.map +1 -0
  36. package/dist/bundle-format/index.d.ts +6 -0
  37. package/dist/bundle-format/index.d.ts.map +1 -0
  38. package/dist/bundle-format/index.js +36 -0
  39. package/dist/bundle-format/index.js.map +1 -0
  40. package/dist/commands/activate.d.ts +15 -0
  41. package/dist/commands/activate.d.ts.map +1 -0
  42. package/dist/commands/activate.js +139 -0
  43. package/dist/commands/activate.js.map +1 -0
  44. package/dist/commands/backup.d.ts +11 -0
  45. package/dist/commands/backup.d.ts.map +1 -0
  46. package/dist/commands/backup.js +75 -0
  47. package/dist/commands/backup.js.map +1 -0
  48. package/dist/commands/config/get.d.ts +10 -0
  49. package/dist/commands/config/get.d.ts.map +1 -0
  50. package/dist/commands/config/get.js +33 -0
  51. package/dist/commands/config/get.js.map +1 -0
  52. package/dist/commands/config/list.d.ts +7 -0
  53. package/dist/commands/config/list.d.ts.map +1 -0
  54. package/dist/commands/config/list.js +43 -0
  55. package/dist/commands/config/list.js.map +1 -0
  56. package/dist/commands/config/set.d.ts +11 -0
  57. package/dist/commands/config/set.d.ts.map +1 -0
  58. package/dist/commands/config/set.js +56 -0
  59. package/dist/commands/config/set.js.map +1 -0
  60. package/dist/commands/db/migrate.d.ts +10 -0
  61. package/dist/commands/db/migrate.d.ts.map +1 -0
  62. package/dist/commands/db/migrate.js +67 -0
  63. package/dist/commands/db/migrate.js.map +1 -0
  64. package/dist/commands/dev.d.ts +19 -0
  65. package/dist/commands/dev.d.ts.map +1 -0
  66. package/dist/commands/dev.js +149 -0
  67. package/dist/commands/dev.js.map +1 -0
  68. package/dist/commands/doctor.d.ts +11 -0
  69. package/dist/commands/doctor.d.ts.map +1 -0
  70. package/dist/commands/doctor.js +75 -0
  71. package/dist/commands/doctor.js.map +1 -0
  72. package/dist/commands/health.d.ts +12 -0
  73. package/dist/commands/health.d.ts.map +1 -0
  74. package/dist/commands/health.js +109 -0
  75. package/dist/commands/health.js.map +1 -0
  76. package/dist/commands/install.d.ts +60 -0
  77. package/dist/commands/install.d.ts.map +1 -0
  78. package/dist/commands/install.js +486 -0
  79. package/dist/commands/install.js.map +1 -0
  80. package/dist/commands/iptv/snapshot.d.ts +10 -0
  81. package/dist/commands/iptv/snapshot.d.ts.map +1 -0
  82. package/dist/commands/iptv/snapshot.js +55 -0
  83. package/dist/commands/iptv/snapshot.js.map +1 -0
  84. package/dist/commands/library/drives.d.ts +7 -0
  85. package/dist/commands/library/drives.d.ts.map +1 -0
  86. package/dist/commands/library/drives.js +71 -0
  87. package/dist/commands/library/drives.js.map +1 -0
  88. package/dist/commands/library/relink.d.ts +10 -0
  89. package/dist/commands/library/relink.d.ts.map +1 -0
  90. package/dist/commands/library/relink.js +72 -0
  91. package/dist/commands/library/relink.js.map +1 -0
  92. package/dist/commands/library/scan.d.ts +16 -0
  93. package/dist/commands/library/scan.d.ts.map +1 -0
  94. package/dist/commands/library/scan.js +87 -0
  95. package/dist/commands/library/scan.js.map +1 -0
  96. package/dist/commands/library/sections.d.ts +7 -0
  97. package/dist/commands/library/sections.d.ts.map +1 -0
  98. package/dist/commands/library/sections.js +33 -0
  99. package/dist/commands/library/sections.js.map +1 -0
  100. package/dist/commands/library/status.d.ts +7 -0
  101. package/dist/commands/library/status.d.ts.map +1 -0
  102. package/dist/commands/library/status.js +37 -0
  103. package/dist/commands/library/status.js.map +1 -0
  104. package/dist/commands/list.d.ts +7 -0
  105. package/dist/commands/list.d.ts.map +1 -0
  106. package/dist/commands/list.js +73 -0
  107. package/dist/commands/list.js.map +1 -0
  108. package/dist/commands/live/channels.d.ts +10 -0
  109. package/dist/commands/live/channels.d.ts.map +1 -0
  110. package/dist/commands/live/channels.js +55 -0
  111. package/dist/commands/live/channels.js.map +1 -0
  112. package/dist/commands/live/test.d.ts +15 -0
  113. package/dist/commands/live/test.d.ts.map +1 -0
  114. package/dist/commands/live/test.js +116 -0
  115. package/dist/commands/live/test.js.map +1 -0
  116. package/dist/commands/logs.d.ts +16 -0
  117. package/dist/commands/logs.d.ts.map +1 -0
  118. package/dist/commands/logs.js +77 -0
  119. package/dist/commands/logs.js.map +1 -0
  120. package/dist/commands/migrate-cli.d.ts +11 -0
  121. package/dist/commands/migrate-cli.d.ts.map +1 -0
  122. package/dist/commands/migrate-cli.js +116 -0
  123. package/dist/commands/migrate-cli.js.map +1 -0
  124. package/dist/commands/owner/reset.d.ts +7 -0
  125. package/dist/commands/owner/reset.d.ts.map +1 -0
  126. package/dist/commands/owner/reset.js +74 -0
  127. package/dist/commands/owner/reset.js.map +1 -0
  128. package/dist/commands/restart.d.ts +11 -0
  129. package/dist/commands/restart.d.ts.map +1 -0
  130. package/dist/commands/restart.js +53 -0
  131. package/dist/commands/restart.js.map +1 -0
  132. package/dist/commands/restore.d.ts +17 -0
  133. package/dist/commands/restore.d.ts.map +1 -0
  134. package/dist/commands/restore.js +148 -0
  135. package/dist/commands/restore.js.map +1 -0
  136. package/dist/commands/self-update.d.ts +10 -0
  137. package/dist/commands/self-update.d.ts.map +1 -0
  138. package/dist/commands/self-update.js +98 -0
  139. package/dist/commands/self-update.js.map +1 -0
  140. package/dist/commands/setup.d.ts +19 -0
  141. package/dist/commands/setup.d.ts.map +1 -0
  142. package/dist/commands/setup.js +111 -0
  143. package/dist/commands/setup.js.map +1 -0
  144. package/dist/commands/shell.d.ts +118 -0
  145. package/dist/commands/shell.d.ts.map +1 -0
  146. package/dist/commands/shell.js +415 -0
  147. package/dist/commands/shell.js.map +1 -0
  148. package/dist/commands/start.d.ts +12 -0
  149. package/dist/commands/start.d.ts.map +1 -0
  150. package/dist/commands/start.js +108 -0
  151. package/dist/commands/start.js.map +1 -0
  152. package/dist/commands/status.d.ts +8 -0
  153. package/dist/commands/status.d.ts.map +1 -0
  154. package/dist/commands/status.js +115 -0
  155. package/dist/commands/status.js.map +1 -0
  156. package/dist/commands/stop.d.ts +11 -0
  157. package/dist/commands/stop.d.ts.map +1 -0
  158. package/dist/commands/stop.js +45 -0
  159. package/dist/commands/stop.js.map +1 -0
  160. package/dist/commands/stream/cancel.d.ts +13 -0
  161. package/dist/commands/stream/cancel.d.ts.map +1 -0
  162. package/dist/commands/stream/cancel.js +31 -0
  163. package/dist/commands/stream/cancel.js.map +1 -0
  164. package/dist/commands/stream/encoders.d.ts +7 -0
  165. package/dist/commands/stream/encoders.d.ts.map +1 -0
  166. package/dist/commands/stream/encoders.js +42 -0
  167. package/dist/commands/stream/encoders.js.map +1 -0
  168. package/dist/commands/stream/queue.d.ts +7 -0
  169. package/dist/commands/stream/queue.d.ts.map +1 -0
  170. package/dist/commands/stream/queue.js +52 -0
  171. package/dist/commands/stream/queue.js.map +1 -0
  172. package/dist/commands/stream/sessions.d.ts +7 -0
  173. package/dist/commands/stream/sessions.d.ts.map +1 -0
  174. package/dist/commands/stream/sessions.js +44 -0
  175. package/dist/commands/stream/sessions.js.map +1 -0
  176. package/dist/commands/uninstall.d.ts +23 -0
  177. package/dist/commands/uninstall.d.ts.map +1 -0
  178. package/dist/commands/uninstall.js +290 -0
  179. package/dist/commands/uninstall.js.map +1 -0
  180. package/dist/commands/update.d.ts +21 -0
  181. package/dist/commands/update.d.ts.map +1 -0
  182. package/dist/commands/update.js +290 -0
  183. package/dist/commands/update.js.map +1 -0
  184. package/dist/commands/watch.d.ts +10 -0
  185. package/dist/commands/watch.d.ts.map +1 -0
  186. package/dist/commands/watch.js +38 -0
  187. package/dist/commands/watch.js.map +1 -0
  188. package/dist/config/local-config.d.ts +22 -0
  189. package/dist/config/local-config.d.ts.map +1 -0
  190. package/dist/config/local-config.js +79 -0
  191. package/dist/config/local-config.js.map +1 -0
  192. package/dist/core-scripts/run.d.ts +22 -0
  193. package/dist/core-scripts/run.d.ts.map +1 -0
  194. package/dist/core-scripts/run.js +65 -0
  195. package/dist/core-scripts/run.js.map +1 -0
  196. package/dist/doctor/check.types.d.ts +51 -0
  197. package/dist/doctor/check.types.d.ts.map +1 -0
  198. package/dist/doctor/check.types.js +14 -0
  199. package/dist/doctor/check.types.js.map +1 -0
  200. package/dist/doctor/checks/core.check.d.ts +11 -0
  201. package/dist/doctor/checks/core.check.d.ts.map +1 -0
  202. package/dist/doctor/checks/core.check.js +104 -0
  203. package/dist/doctor/checks/core.check.js.map +1 -0
  204. package/dist/doctor/checks/data.check.d.ts +11 -0
  205. package/dist/doctor/checks/data.check.d.ts.map +1 -0
  206. package/dist/doctor/checks/data.check.js +70 -0
  207. package/dist/doctor/checks/data.check.js.map +1 -0
  208. package/dist/doctor/checks/environment.check.d.ts +6 -0
  209. package/dist/doctor/checks/environment.check.d.ts.map +1 -0
  210. package/dist/doctor/checks/environment.check.js +70 -0
  211. package/dist/doctor/checks/environment.check.js.map +1 -0
  212. package/dist/doctor/checks/integrity.check.d.ts +4 -0
  213. package/dist/doctor/checks/integrity.check.d.ts.map +1 -0
  214. package/dist/doctor/checks/integrity.check.js +89 -0
  215. package/dist/doctor/checks/integrity.check.js.map +1 -0
  216. package/dist/doctor/checks/isolation.check.d.ts +49 -0
  217. package/dist/doctor/checks/isolation.check.d.ts.map +1 -0
  218. package/dist/doctor/checks/isolation.check.js +220 -0
  219. package/dist/doctor/checks/isolation.check.js.map +1 -0
  220. package/dist/doctor/checks/licence.check.d.ts +8 -0
  221. package/dist/doctor/checks/licence.check.d.ts.map +1 -0
  222. package/dist/doctor/checks/licence.check.js +172 -0
  223. package/dist/doctor/checks/licence.check.js.map +1 -0
  224. package/dist/doctor/checks/ports.check.d.ts +4 -0
  225. package/dist/doctor/checks/ports.check.d.ts.map +1 -0
  226. package/dist/doctor/checks/ports.check.js +52 -0
  227. package/dist/doctor/checks/ports.check.js.map +1 -0
  228. package/dist/doctor/checks/supervisor.check.d.ts +19 -0
  229. package/dist/doctor/checks/supervisor.check.d.ts.map +1 -0
  230. package/dist/doctor/checks/supervisor.check.js +152 -0
  231. package/dist/doctor/checks/supervisor.check.js.map +1 -0
  232. package/dist/doctor/checks/tooling.check.d.ts +3 -0
  233. package/dist/doctor/checks/tooling.check.d.ts.map +1 -0
  234. package/dist/doctor/checks/tooling.check.js +43 -0
  235. package/dist/doctor/checks/tooling.check.js.map +1 -0
  236. package/dist/doctor/registry.d.ts +15 -0
  237. package/dist/doctor/registry.d.ts.map +1 -0
  238. package/dist/doctor/registry.js +53 -0
  239. package/dist/doctor/registry.js.map +1 -0
  240. package/dist/exit-codes.d.ts +18 -0
  241. package/dist/exit-codes.d.ts.map +1 -0
  242. package/dist/exit-codes.js +23 -0
  243. package/dist/exit-codes.js.map +1 -0
  244. package/dist/index.d.ts +2 -0
  245. package/dist/index.d.ts.map +1 -0
  246. package/dist/index.js +16 -0
  247. package/dist/index.js.map +1 -0
  248. package/dist/logs/sink.d.ts +11 -0
  249. package/dist/logs/sink.d.ts.map +1 -0
  250. package/dist/logs/sink.js +73 -0
  251. package/dist/logs/sink.js.map +1 -0
  252. package/dist/logs/tail.d.ts +17 -0
  253. package/dist/logs/tail.d.ts.map +1 -0
  254. package/dist/logs/tail.js +98 -0
  255. package/dist/logs/tail.js.map +1 -0
  256. package/dist/packaging/boot-task.d.ts +56 -0
  257. package/dist/packaging/boot-task.d.ts.map +1 -0
  258. package/dist/packaging/boot-task.js +151 -0
  259. package/dist/packaging/boot-task.js.map +1 -0
  260. package/dist/packaging/install.d.ts +154 -0
  261. package/dist/packaging/install.d.ts.map +1 -0
  262. package/dist/packaging/install.js +381 -0
  263. package/dist/packaging/install.js.map +1 -0
  264. package/dist/packaging/layout.d.ts +153 -0
  265. package/dist/packaging/layout.d.ts.map +1 -0
  266. package/dist/packaging/layout.js +168 -0
  267. package/dist/packaging/layout.js.map +1 -0
  268. package/dist/packaging/machine-path.d.ts +52 -0
  269. package/dist/packaging/machine-path.d.ts.map +1 -0
  270. package/dist/packaging/machine-path.js +237 -0
  271. package/dist/packaging/machine-path.js.map +1 -0
  272. package/dist/packaging/manifest.d.ts +37 -0
  273. package/dist/packaging/manifest.d.ts.map +1 -0
  274. package/dist/packaging/manifest.js +115 -0
  275. package/dist/packaging/manifest.js.map +1 -0
  276. package/dist/packaging/shims.d.ts +31 -0
  277. package/dist/packaging/shims.d.ts.map +1 -0
  278. package/dist/packaging/shims.js +165 -0
  279. package/dist/packaging/shims.js.map +1 -0
  280. package/dist/probes/internal-paths.d.ts +35 -0
  281. package/dist/probes/internal-paths.d.ts.map +1 -0
  282. package/dist/probes/internal-paths.js +58 -0
  283. package/dist/probes/internal-paths.js.map +1 -0
  284. package/dist/probes/internal.client.d.ts +54 -0
  285. package/dist/probes/internal.client.d.ts.map +1 -0
  286. package/dist/probes/internal.client.js +123 -0
  287. package/dist/probes/internal.client.js.map +1 -0
  288. package/dist/probes/port.probe.d.ts +21 -0
  289. package/dist/probes/port.probe.d.ts.map +1 -0
  290. package/dist/probes/port.probe.js +42 -0
  291. package/dist/probes/port.probe.js.map +1 -0
  292. package/dist/probes/service.probe.d.ts +29 -0
  293. package/dist/probes/service.probe.d.ts.map +1 -0
  294. package/dist/probes/service.probe.js +65 -0
  295. package/dist/probes/service.probe.js.map +1 -0
  296. package/dist/profiles/appliance.profile.d.ts +20 -0
  297. package/dist/profiles/appliance.profile.d.ts.map +1 -0
  298. package/dist/profiles/appliance.profile.js +137 -0
  299. package/dist/profiles/appliance.profile.js.map +1 -0
  300. package/dist/profiles/dev.profile.d.ts +22 -0
  301. package/dist/profiles/dev.profile.d.ts.map +1 -0
  302. package/dist/profiles/dev.profile.js +104 -0
  303. package/dist/profiles/dev.profile.js.map +1 -0
  304. package/dist/profiles/resolve.d.ts +37 -0
  305. package/dist/profiles/resolve.d.ts.map +1 -0
  306. package/dist/profiles/resolve.js +198 -0
  307. package/dist/profiles/resolve.js.map +1 -0
  308. package/dist/profiles/types.d.ts +57 -0
  309. package/dist/profiles/types.d.ts.map +1 -0
  310. package/dist/profiles/types.js +15 -0
  311. package/dist/profiles/types.js.map +1 -0
  312. package/dist/registry/local-registry.d.ts +79 -0
  313. package/dist/registry/local-registry.d.ts.map +1 -0
  314. package/dist/registry/local-registry.js +252 -0
  315. package/dist/registry/local-registry.js.map +1 -0
  316. package/dist/render/banner.d.ts +13 -0
  317. package/dist/render/banner.d.ts.map +1 -0
  318. package/dist/render/banner.js +83 -0
  319. package/dist/render/banner.js.map +1 -0
  320. package/dist/render/boot.render.d.ts +123 -0
  321. package/dist/render/boot.render.d.ts.map +1 -0
  322. package/dist/render/boot.render.js +288 -0
  323. package/dist/render/boot.render.js.map +1 -0
  324. package/dist/render/brand.d.ts +16 -0
  325. package/dist/render/brand.d.ts.map +1 -0
  326. package/dist/render/brand.js +22 -0
  327. package/dist/render/brand.js.map +1 -0
  328. package/dist/render/doctor.render.d.ts +12 -0
  329. package/dist/render/doctor.render.d.ts.map +1 -0
  330. package/dist/render/doctor.render.js +95 -0
  331. package/dist/render/doctor.render.js.map +1 -0
  332. package/dist/render/json.d.ts +29 -0
  333. package/dist/render/json.d.ts.map +1 -0
  334. package/dist/render/json.js +19 -0
  335. package/dist/render/json.js.map +1 -0
  336. package/dist/render/licence.render.d.ts +10 -0
  337. package/dist/render/licence.render.d.ts.map +1 -0
  338. package/dist/render/licence.render.js +167 -0
  339. package/dist/render/licence.render.js.map +1 -0
  340. package/dist/render/status.render.d.ts +6 -0
  341. package/dist/render/status.render.d.ts.map +1 -0
  342. package/dist/render/status.render.js +52 -0
  343. package/dist/render/status.render.js.map +1 -0
  344. package/dist/render/theme.d.ts +66 -0
  345. package/dist/render/theme.d.ts.map +1 -0
  346. package/dist/render/theme.js +89 -0
  347. package/dist/render/theme.js.map +1 -0
  348. package/dist/runtime-guard.d.ts +19 -0
  349. package/dist/runtime-guard.d.ts.map +1 -0
  350. package/dist/runtime-guard.js +57 -0
  351. package/dist/runtime-guard.js.map +1 -0
  352. package/dist/shell/input-mode.d.ts +25 -0
  353. package/dist/shell/input-mode.d.ts.map +1 -0
  354. package/dist/shell/input-mode.js +17 -0
  355. package/dist/shell/input-mode.js.map +1 -0
  356. package/dist/shell/parse-line.d.ts +6 -0
  357. package/dist/shell/parse-line.d.ts.map +1 -0
  358. package/dist/shell/parse-line.js +62 -0
  359. package/dist/shell/parse-line.js.map +1 -0
  360. package/dist/shell/suggestions.d.ts +14 -0
  361. package/dist/shell/suggestions.d.ts.map +1 -0
  362. package/dist/shell/suggestions.js +35 -0
  363. package/dist/shell/suggestions.js.map +1 -0
  364. package/dist/supervisor/dependencies.d.ts +2 -0
  365. package/dist/supervisor/dependencies.d.ts.map +1 -0
  366. package/dist/supervisor/dependencies.js +38 -0
  367. package/dist/supervisor/dependencies.js.map +1 -0
  368. package/dist/supervisor/entry.d.ts +36 -0
  369. package/dist/supervisor/entry.d.ts.map +1 -0
  370. package/dist/supervisor/entry.js +171 -0
  371. package/dist/supervisor/entry.js.map +1 -0
  372. package/dist/supervisor/inspect.d.ts +17 -0
  373. package/dist/supervisor/inspect.d.ts.map +1 -0
  374. package/dist/supervisor/inspect.js +39 -0
  375. package/dist/supervisor/inspect.js.map +1 -0
  376. package/dist/supervisor/invocation.d.ts +27 -0
  377. package/dist/supervisor/invocation.d.ts.map +1 -0
  378. package/dist/supervisor/invocation.js +33 -0
  379. package/dist/supervisor/invocation.js.map +1 -0
  380. package/dist/supervisor/monitor.d.ts +63 -0
  381. package/dist/supervisor/monitor.d.ts.map +1 -0
  382. package/dist/supervisor/monitor.js +141 -0
  383. package/dist/supervisor/monitor.js.map +1 -0
  384. package/dist/supervisor/orchestrator.d.ts +52 -0
  385. package/dist/supervisor/orchestrator.d.ts.map +1 -0
  386. package/dist/supervisor/orchestrator.js +154 -0
  387. package/dist/supervisor/orchestrator.js.map +1 -0
  388. package/dist/supervisor/pidfile.d.ts +21 -0
  389. package/dist/supervisor/pidfile.d.ts.map +1 -0
  390. package/dist/supervisor/pidfile.js +39 -0
  391. package/dist/supervisor/pidfile.js.map +1 -0
  392. package/dist/supervisor/process-identity.d.ts +19 -0
  393. package/dist/supervisor/process-identity.d.ts.map +1 -0
  394. package/dist/supervisor/process-identity.js +51 -0
  395. package/dist/supervisor/process-identity.js.map +1 -0
  396. package/dist/supervisor/readiness.d.ts +17 -0
  397. package/dist/supervisor/readiness.d.ts.map +1 -0
  398. package/dist/supervisor/readiness.js +52 -0
  399. package/dist/supervisor/readiness.js.map +1 -0
  400. package/dist/supervisor/restart-consumer.d.ts +37 -0
  401. package/dist/supervisor/restart-consumer.d.ts.map +1 -0
  402. package/dist/supervisor/restart-consumer.js +119 -0
  403. package/dist/supervisor/restart-consumer.js.map +1 -0
  404. package/dist/supervisor/runner.d.ts +2 -0
  405. package/dist/supervisor/runner.d.ts.map +1 -0
  406. package/dist/supervisor/runner.js +118 -0
  407. package/dist/supervisor/runner.js.map +1 -0
  408. package/dist/supervisor/schedule-timer.d.ts +38 -0
  409. package/dist/supervisor/schedule-timer.d.ts.map +1 -0
  410. package/dist/supervisor/schedule-timer.js +148 -0
  411. package/dist/supervisor/schedule-timer.js.map +1 -0
  412. package/dist/supervisor/spawn.d.ts +18 -0
  413. package/dist/supervisor/spawn.d.ts.map +1 -0
  414. package/dist/supervisor/spawn.js +119 -0
  415. package/dist/supervisor/spawn.js.map +1 -0
  416. package/dist/supervisor/state-files.d.ts +33 -0
  417. package/dist/supervisor/state-files.d.ts.map +1 -0
  418. package/dist/supervisor/state-files.js +110 -0
  419. package/dist/supervisor/state-files.js.map +1 -0
  420. package/dist/supervisor/tree-kill.d.ts +14 -0
  421. package/dist/supervisor/tree-kill.d.ts.map +1 -0
  422. package/dist/supervisor/tree-kill.js +82 -0
  423. package/dist/supervisor/tree-kill.js.map +1 -0
  424. package/dist/ui/health-panel.d.ts +8 -0
  425. package/dist/ui/health-panel.d.ts.map +1 -0
  426. package/dist/ui/health-panel.js +91 -0
  427. package/dist/ui/health-panel.js.map +1 -0
  428. package/dist/updating/apply.d.ts +50 -0
  429. package/dist/updating/apply.d.ts.map +1 -0
  430. package/dist/updating/apply.js +172 -0
  431. package/dist/updating/apply.js.map +1 -0
  432. package/dist/updating/download.d.ts +44 -0
  433. package/dist/updating/download.d.ts.map +1 -0
  434. package/dist/updating/download.js +144 -0
  435. package/dist/updating/download.js.map +1 -0
  436. package/dist/updating/rollback.d.ts +33 -0
  437. package/dist/updating/rollback.d.ts.map +1 -0
  438. package/dist/updating/rollback.js +54 -0
  439. package/dist/updating/rollback.js.map +1 -0
  440. package/dist/updating/self.d.ts +16 -0
  441. package/dist/updating/self.d.ts.map +1 -0
  442. package/dist/updating/self.js +50 -0
  443. package/dist/updating/self.js.map +1 -0
  444. package/dist/updating/verify.d.ts +25 -0
  445. package/dist/updating/verify.d.ts.map +1 -0
  446. package/dist/updating/verify.js +51 -0
  447. package/dist/updating/verify.js.map +1 -0
  448. package/dist/updating/versions.d.ts +31 -0
  449. package/dist/updating/versions.d.ts.map +1 -0
  450. package/dist/updating/versions.js +78 -0
  451. package/dist/updating/versions.js.map +1 -0
  452. package/dist/version.d.ts +4 -0
  453. package/dist/version.d.ts.map +1 -0
  454. package/dist/version.js +29 -0
  455. package/dist/version.js.map +1 -0
  456. package/package.json +106 -0
@@ -0,0 +1,123 @@
1
+ import { findService, serviceOrigin } from "../profiles/types.js";
2
+ import { INTERNAL_PATHS } from "./internal-paths.js";
3
+ // AR: عميل السطح الداخلي. هو الطريق **الوحيد** الذي يسأل به الـ CLI النواةَ عن بيانات، تطبيقًا لحدّ
4
+ // المعمارية «الـ CLI يعرض والنواة تقرّر»: لا عميل قاعدة بيانات في هذه المساحة، ولا قراءة ملف
5
+ // لتخمين ما تعرفه النواة (017/FR-014، FR-033).
6
+ //
7
+ // **الفشل هنا حالة عادية لا استثناء.** النواة قد تكون متوقّفة، وهو أوّل ما يُشخَّص لا ما يُخفى:
8
+ // ‎doctor‎ يجب أن يعمل والنواة ميّتة ويقول ذلك بوضوح. لذلك يُعيد هذا العميل نتيجةً موسومة ولا
9
+ // يرمي استثناءً يوقف أمرًا كاملًا (017/FR-015).
10
+ //
11
+ // EN: The internal-surface client. It is the **only** way the CLI asks the core for data, honouring
12
+ // the architecture's boundary — "the CLI displays, the core decides": no database client lives in
13
+ // this workspace, and no file is read to guess what the core knows (017/FR-014, FR-033).
14
+ //
15
+ // **Failure here is ordinary, not exceptional.** The core may be down, and that is the first
16
+ // thing to diagnose rather than hide: `doctor` must work with a dead core and say so plainly.
17
+ // So this client returns a tagged result and never throws in a way that aborts a whole command
18
+ // (017/FR-015).
19
+ const DEFAULT_TIMEOUT_MS = 2_500;
20
+ /** غلاف D4: النواة تلفّ كل استجابة JSON ناجحة في ‎{ data }‎، فننزعه هنا مرّة واحدة. */
21
+ function unwrapEnvelope(body) {
22
+ if (typeof body === "object" && body !== null && "data" in body) {
23
+ return body.data;
24
+ }
25
+ return body;
26
+ }
27
+ /**
28
+ * أصل السطح الداخلي: النواة على هذه الآلة.
29
+ *
30
+ * نستعمل ‎127.0.0.1‎ دائمًا لا عنوان الشبكة، وليس ذلك تفصيلًا: الحارس على الطرف الآخر يقبل
31
+ * اللوب-باك وحده، فطلبٌ إلى عنوان الشبكة الخاص بالجهاز نفسه **سيُرفَض** رغم أنه الجهاز ذاته.
32
+ * ‎serviceOrigin‎ يطبّق هذا التحويل حين تستمع الخدمة على ‎0.0.0.0‎.
33
+ */
34
+ function internalOrigin(profile) {
35
+ const core = findService(profile, "core");
36
+ return core ? serviceOrigin(core) : undefined;
37
+ }
38
+ async function request(profile, path, timeoutMs, init) {
39
+ const origin = internalOrigin(profile);
40
+ if (!origin)
41
+ return { ok: false, reason: "no core service in this profile", unreachable: true };
42
+ const controller = new AbortController();
43
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
44
+ try {
45
+ const response = await fetch(`${origin}${path}`, {
46
+ signal: controller.signal,
47
+ ...(init
48
+ ? {
49
+ method: init.method,
50
+ headers: { "content-type": "application/json" },
51
+ body: JSON.stringify(init.body),
52
+ }
53
+ : {}),
54
+ });
55
+ if (!response.ok) {
56
+ const envelope = (await response.json().catch(() => undefined));
57
+ const error = envelope?.error;
58
+ return {
59
+ ok: false,
60
+ // رسالة النواة إن وُجدت، وحالةُ HTTP حين لا تكون هناك رسالة أصلًا.
61
+ reason: error?.message ?? `the core responded with status ${response.status}`,
62
+ // ردّ بخطأ يعني أنه **حيّ**: التمييز يغيّر العلاج المقترح في ‎doctor‎.
63
+ unreachable: false,
64
+ ...(error?.code && error.message
65
+ ? { error: { code: error.code, message: error.message, details: error.details } }
66
+ : {}),
67
+ };
68
+ }
69
+ const body = (await response.json().catch(() => undefined));
70
+ return { ok: true, data: unwrapEnvelope(body) };
71
+ }
72
+ catch (error) {
73
+ const aborted = error instanceof Error && error.name === "AbortError";
74
+ return {
75
+ ok: false,
76
+ reason: aborted ? `the core did not answer within ${timeoutMs}ms` : "the core is not reachable",
77
+ unreachable: true,
78
+ };
79
+ }
80
+ finally {
81
+ clearTimeout(timer);
82
+ }
83
+ }
84
+ /** اللقطة الغنيّة من ‎/internal/health‎. الحقول الاختيارية الغائبة تُرسَم شرطةً لا صفرًا. */
85
+ export function fetchInternalHealth(profile, timeoutMs = DEFAULT_TIMEOUT_MS) {
86
+ return request(profile, INTERNAL_PATHS.HEALTH, timeoutMs);
87
+ }
88
+ /** قراءة عامة من السطح الداخلي. */
89
+ export function getInternal(profile, path, timeoutMs = DEFAULT_TIMEOUT_MS) {
90
+ return request(profile, path, timeoutMs);
91
+ }
92
+ /**
93
+ * كتابة على السطح الداخلي. المهلة أطول بكثير من القراءة: ‎VACUUM INTO‎ على قاعدة كبيرة يستغرق
94
+ * ثوانيَ حقيقية، وقطعُه في منتصفه يترك أرشيفًا ناقصًا — وهو بالضبط ما بُني هذا المسار لتفاديه.
95
+ */
96
+ export function postInternal(profile, path, body, timeoutMs = 120_000) {
97
+ return request(profile, path, timeoutMs, { method: "POST", body });
98
+ }
99
+ // ── الترخيص (P4.4) ────────────────────────────────────────────────────────────
100
+ /** حالة الرخصة على هذا الجهاز، كما تصفها النواة لشاشة التفعيل حرفًا بحرف. */
101
+ export function fetchLicenseStatus(profile, timeoutMs = DEFAULT_TIMEOUT_MS) {
102
+ return request(profile, INTERNAL_PATHS.LICENSE_STATUS, timeoutMs);
103
+ }
104
+ /**
105
+ * AR: يفعّل هذا الجهاز. المهلة **دقيقة كاملة** لا الافتراضيةَ القصيرة: النداء يعبر النواةَ إلى
106
+ * المركز عبر الإنترنت، والنواة تعيد المحاولة ثلاثًا بتباعد أسّي حين لا يجيب. قطعُه بعد
107
+ * ثانيتين ونصف كان يقول «النواة لا تجيب» بينما هي تنتظر ردًّا سيصل.
108
+ * EN: Activates this machine. The timeout is **a full minute** rather than the short default: the
109
+ * call travels through the core to the centre over the internet, and the core retries three
110
+ * times with exponential backoff when there is no answer. Cutting it off after 2.5 seconds
111
+ * reported "the core is not answering" while it was waiting for a reply that would arrive.
112
+ */
113
+ export function activateLicense(profile, code) {
114
+ return request(profile, INTERNAL_PATHS.LICENSE_ACTIVATE, 60_000, {
115
+ method: "POST",
116
+ body: { code },
117
+ });
118
+ }
119
+ /** يوقف تفعيل هذا الجهاز ويحرّر مقعده في المركز. يُنادى من ‎uninstall‎ قبل حذف أي ملف. */
120
+ export function deactivateLicense(profile) {
121
+ return request(profile, INTERNAL_PATHS.LICENSE_DEACTIVATE, 30_000, { method: "POST", body: {} });
122
+ }
123
+ //# sourceMappingURL=internal.client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal.client.js","sourceRoot":"","sources":["../../src/probes/internal.client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export interface PortHolder {
2
+ pid: number;
3
+ name: string;
4
+ }
5
+ /**
6
+ * هل المنفذ حرّ؟ نفحص بمحاولة الاستماع لا بمحاولة الاتصال: خدمة تستمع على 127.0.0.1 فقط تجعل اتصالًا
7
+ * على 0.0.0.0 يفشل رغم أن الإقلاع سيصطدم بها.
8
+ */
9
+ export declare function isPortFree(port: number, host?: string): Promise<boolean>;
10
+ /**
11
+ * من يستمع على المنفذ. PowerShell هو الطريق الوحيد الموثوق على ويندوز؛ على غيره نُرجع undefined
12
+ * ونكتفي بأن المنفذ محجوز، لأن الرسالة الناقصة أفضل من أمر يفشل.
13
+ */
14
+ export declare function findPortHolder(port: number): Promise<PortHolder | undefined>;
15
+ export interface PortConflict {
16
+ port: number;
17
+ holder?: PortHolder;
18
+ }
19
+ /** يفحص عدة منافذ معًا ويعيد المتعارض منها فقط، مع صاحبه إن أمكن التعرّف عليه. */
20
+ export declare function findPortConflicts(ports: number[]): Promise<PortConflict[]>;
21
+ //# sourceMappingURL=port.probe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"port.probe.d.ts","sourceRoot":"","sources":["../../src/probes/port.probe.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,SAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAWjF;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAmBlF;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB;AAED,kFAAkF;AAClF,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAUhF"}
@@ -0,0 +1,42 @@
1
+ import { createServer } from "node:net";
2
+ import { execa } from "execa";
3
+ /**
4
+ * هل المنفذ حرّ؟ نفحص بمحاولة الاستماع لا بمحاولة الاتصال: خدمة تستمع على 127.0.0.1 فقط تجعل اتصالًا
5
+ * على 0.0.0.0 يفشل رغم أن الإقلاع سيصطدم بها.
6
+ */
7
+ export async function isPortFree(port, host = "0.0.0.0") {
8
+ return new Promise((resolvePromise) => {
9
+ const server = createServer();
10
+ server.once("error", () => resolvePromise(false));
11
+ server.once("listening", () => {
12
+ server.close(() => resolvePromise(true));
13
+ });
14
+ server.listen(port, host);
15
+ });
16
+ }
17
+ /**
18
+ * من يستمع على المنفذ. PowerShell هو الطريق الوحيد الموثوق على ويندوز؛ على غيره نُرجع undefined
19
+ * ونكتفي بأن المنفذ محجوز، لأن الرسالة الناقصة أفضل من أمر يفشل.
20
+ */
21
+ export async function findPortHolder(port) {
22
+ if (process.platform !== "win32")
23
+ return undefined;
24
+ const script = `$c = Get-NetTCPConnection -LocalPort ${port} -State Listen -ErrorAction SilentlyContinue | Select-Object -First 1; if ($c) { $p = Get-Process -Id $c.OwningProcess -ErrorAction SilentlyContinue; if ($p) { "$($p.Id)|$($p.ProcessName)" } }`;
25
+ try {
26
+ const { stdout } = await execa("powershell.exe", ["-NoProfile", "-NonInteractive", "-Command", script], { timeout: 8_000, reject: false });
27
+ const [pid, name] = stdout.trim().split("|");
28
+ if (!pid || !name)
29
+ return undefined;
30
+ return { pid: Number(pid), name };
31
+ }
32
+ catch {
33
+ return undefined;
34
+ }
35
+ }
36
+ /** يفحص عدة منافذ معًا ويعيد المتعارض منها فقط، مع صاحبه إن أمكن التعرّف عليه. */
37
+ export async function findPortConflicts(ports) {
38
+ const results = await Promise.all(ports.map(async (port) => ({ port, free: await isPortFree(port) })));
39
+ const busy = results.filter((result) => !result.free);
40
+ return Promise.all(busy.map(async ({ port }) => ({ port, holder: await findPortHolder(port) })));
41
+ }
42
+ //# sourceMappingURL=port.probe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"port.probe.js","sourceRoot":"","sources":["../../src/probes/port.probe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAa9B;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY,EAAE,IAAI,GAAG,SAAS;IAC7D,OAAO,IAAI,OAAO,CAAC,CAAC,cAAc,EAAE,EAAE;QACpC,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;QAE9B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;YAC5B,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,SAAS,CAAC;IAEnD,MAAM,MAAM,GAAG,wCAAwC,IAAI,kMAAkM,CAAC;IAE9P,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAC5B,gBAAgB,EAChB,CAAC,YAAY,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,CAAC,EACrD,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAClC,CAAC;QAEF,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7C,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI;YAAE,OAAO,SAAS,CAAC;QAEpC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAOD,kFAAkF;AAClF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAAe;IACrD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CACpE,CAAC;IAEF,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAEtD,OAAO,OAAO,CAAC,GAAG,CAChB,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAC7E,CAAC;AACJ,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { type ServiceDefinition } from "../profiles/types.js";
2
+ export interface ProbeResult {
3
+ reachable: boolean;
4
+ /** حمولة الخدمة إن ردّت. يُستعمل في ‎status‎ و‎health‎ لعرض النسخة ومدة التشغيل. */
5
+ payload?: unknown;
6
+ /** سبب الفشل بالعربية، للعرض لا للتحليل. */
7
+ reason?: string;
8
+ }
9
+ /** يسبر خدمة واحدة بالطريقة التي يقرّرها تعريفها. */
10
+ export declare function probeService(service: ServiceDefinition, timeoutMs?: number): Promise<ProbeResult>;
11
+ /** لقطة صحة النواة كما تعيدها اليوم. الحقول اختيارية لأن العقد سيتوسّع في C3. */
12
+ export interface CoreHealthPayload {
13
+ status?: string;
14
+ version?: string;
15
+ environment?: string;
16
+ uptimeSeconds?: number;
17
+ checks?: {
18
+ name: string;
19
+ status: string;
20
+ }[];
21
+ }
22
+ export declare function asCoreHealth(payload: unknown): CoreHealthPayload | undefined;
23
+ /** لقطة خدمة البث: ‎{ status, channels }‎ من ‎/internal/health‎. */
24
+ export interface LiveHealthPayload {
25
+ status?: string;
26
+ channels?: number;
27
+ }
28
+ export declare function asLiveHealth(payload: unknown): LiveHealthPayload | undefined;
29
+ //# sourceMappingURL=service.probe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.probe.d.ts","sourceRoot":"","sources":["../../src/probes/service.probe.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,KAAK,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAQ7E,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,oFAAoF;IACpF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAsDD,qDAAqD;AACrD,wBAAsB,YAAY,CAChC,OAAO,EAAE,iBAAiB,EAC1B,SAAS,GAAE,MAA2B,GACrC,OAAO,CAAC,WAAW,CAAC,CAMtB;AAED,iFAAiF;AACjF,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC7C;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,iBAAiB,GAAG,SAAS,CAG5E;AAED,oEAAoE;AACpE,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,iBAAiB,GAAG,SAAS,CAG5E"}
@@ -0,0 +1,65 @@
1
+ import { Socket } from "node:net";
2
+ import { serviceOrigin } from "../profiles/types.js";
3
+ const DEFAULT_TIMEOUT_MS = 2_500;
4
+ /** غلاف D4: كل استجابة ناجحة من النواة ملفوفة في ‎{ data }‎، فننزع الغلاف هنا مرة واحدة. */
5
+ function unwrapEnvelope(body) {
6
+ if (typeof body === "object" && body !== null && "data" in body) {
7
+ return body.data;
8
+ }
9
+ return body;
10
+ }
11
+ async function probeHttp(url, timeoutMs) {
12
+ const controller = new AbortController();
13
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
14
+ try {
15
+ const response = await fetch(url, { signal: controller.signal });
16
+ if (!response.ok) {
17
+ return { reachable: false, reason: `responded with status ${response.status}` };
18
+ }
19
+ const body = (await response.json().catch(() => undefined));
20
+ return { reachable: true, payload: unwrapEnvelope(body) };
21
+ }
22
+ catch (error) {
23
+ const aborted = error instanceof Error && error.name === "AbortError";
24
+ return { reachable: false, reason: aborted ? "timed out" : "no connection" };
25
+ }
26
+ finally {
27
+ clearTimeout(timer);
28
+ }
29
+ }
30
+ async function probeTcp(host, port, timeoutMs) {
31
+ return new Promise((resolvePromise) => {
32
+ const socket = new Socket();
33
+ let settled = false;
34
+ const finish = (result) => {
35
+ if (settled)
36
+ return;
37
+ settled = true;
38
+ socket.destroy();
39
+ resolvePromise(result);
40
+ };
41
+ socket.setTimeout(timeoutMs);
42
+ socket.once("connect", () => finish({ reachable: true }));
43
+ socket.once("timeout", () => finish({ reachable: false, reason: "timed out" }));
44
+ socket.once("error", () => finish({ reachable: false, reason: "no connection" }));
45
+ socket.connect(port, host === "0.0.0.0" || host === "::" ? "127.0.0.1" : host);
46
+ });
47
+ }
48
+ /** يسبر خدمة واحدة بالطريقة التي يقرّرها تعريفها. */
49
+ export async function probeService(service, timeoutMs = DEFAULT_TIMEOUT_MS) {
50
+ if (service.readiness.kind === "http") {
51
+ return probeHttp(`${serviceOrigin(service)}${service.readiness.path}`, timeoutMs);
52
+ }
53
+ return probeTcp(service.host, service.port, timeoutMs);
54
+ }
55
+ export function asCoreHealth(payload) {
56
+ if (typeof payload !== "object" || payload === null)
57
+ return undefined;
58
+ return payload;
59
+ }
60
+ export function asLiveHealth(payload) {
61
+ if (typeof payload !== "object" || payload === null)
62
+ return undefined;
63
+ return payload;
64
+ }
65
+ //# sourceMappingURL=service.probe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.probe.js","sourceRoot":"","sources":["../../src/probes/service.probe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { Profile } from "./types.js";
2
+ /** جذر التثبيت كما نصّت المعمارية v3 §09. */
3
+ export declare const APPLIANCE_ROOT = "C:\\Fantastic";
4
+ export interface ApplianceProfileOptions {
5
+ root: string;
6
+ corePort: number;
7
+ livePort: number;
8
+ logLevel: string;
9
+ /** عنوان البوّابة المركزية. غيابه يترك افتراض النواة كما هو. */
10
+ centralApiUrl?: string;
11
+ /** المفتاح العام الذي يُتحقَّق به من الرخص. ليس سرًّا: يتحقّق ولا يوقّع. */
12
+ licensePublicKey?: string;
13
+ }
14
+ export declare const APPLIANCE_DEFAULTS: {
15
+ readonly corePort: 80;
16
+ readonly livePort: 8081;
17
+ readonly logLevel: "info";
18
+ };
19
+ export declare function createApplianceProfile(options: ApplianceProfileOptions): Profile;
20
+ //# sourceMappingURL=appliance.profile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appliance.profile.d.ts","sourceRoot":"","sources":["../../src/profiles/appliance.profile.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAqB,MAAM,YAAY,CAAC;AAsB7D,6CAA6C;AAC7C,eAAO,MAAM,cAAc,kBAAkB,CAAC;AAE9C,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4EAA4E;IAC5E,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,eAAO,MAAM,kBAAkB;;;;CAKrB,CAAC;AAEX,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAkHhF"}
@@ -0,0 +1,137 @@
1
+ import { join } from "node:path";
2
+ // AR: ملفّ تشغيل الجهاز المركّب عند العميل. خدمتان لا ثلاث: الواجهة ملفات ثابتة تقدّمها النواة عبر
3
+ // ‎PORTAL_DIST‎ ولا تحتاج عملية. هذا الملف هو كامل الفرق بين ما نشغّله نحن وما يشغّله الفني.
4
+ // بقيّة الـ CLI لا تعرف أيّ ملف تشغيل تعمل تحته.
5
+ //
6
+ // **تبديل استراتيجية التغليف يكلّف سطرين هنا ولا شيء سواهما (017/SC-009).**
7
+ // كان هذا الملف يشير إلى ‎core\fantastic-core.exe‎ و‎fantastic-live.exe‎ — ملفّين لم يُنتَجا قط،
8
+ // فكان وضع الجهاز غير قابل للاستنتاج أصلًا. صار يشير إلى ما تُنتجه الحزمة فعلًا:
9
+ // ‎runtime\node.exe‎ ومدخل كل خدمة. وحين يصل الترخيص وتُترجَم الخدمات إلى ملفّات تنفيذية،
10
+ // يعود السطران إلى شكلهما الأول ولا يُعاد كتابة أمر ولا عارضة ولا مسبار ولا مشرف.
11
+ // EN: The installed-appliance profile. Two services, not three: the portal is static files the core
12
+ // serves via PORTAL_DIST and needs no process. This file is the entire difference between what we
13
+ // run and what the technician runs; the rest of the CLI never knows which profile it is under.
14
+ //
15
+ // **Switching packaging strategy costs two lines here and nothing else (017/SC-009).**
16
+ // This file used to point at core\fantastic-core.exe and fantastic-live.exe — two files that were
17
+ // never produced, which made appliance mode impossible to detect at all. It now points at what
18
+ // the bundle actually produces: runtime\node.exe and each service's entry. When licensing lands
19
+ // and the services are compiled into executables, these two lines revert to their original shape
20
+ // and no command, renderer, probe or supervisor is rewritten.
21
+ /** جذر التثبيت كما نصّت المعمارية v3 §09. */
22
+ export const APPLIANCE_ROOT = "C:\\Fantastic";
23
+ export const APPLIANCE_DEFAULTS = {
24
+ // الجهاز عند العميل يخدم المشاهدين على المنفذ 80 فلا يكتب أحد رقم منفذ في المتصفح.
25
+ corePort: 80,
26
+ livePort: 8081,
27
+ logLevel: "info",
28
+ };
29
+ export function createApplianceProfile(options) {
30
+ const { root, corePort, livePort, logLevel, centralApiUrl, licensePublicKey } = options;
31
+ /**
32
+ * AR: إعداد المركز، يُمرَّر **فقط حين يُعرَّف**. تمريرُ سلسلة فارغة أسوأ من الغياب: النواة
33
+ * تراها قيمةً مضبوطة فتتخطّى افتراضها، فتقلع بعنوان فارغ ينتهي كل نداء إليه بخطأ عنوان
34
+ * لا يشير إلى الإعداد الناقص.
35
+ * EN: The centre's configuration, passed **only when defined**. Passing an empty string is worse
36
+ * than passing nothing: the core reads it as a set value and skips its own default, booting
37
+ * with an empty address whose every call ends in a URL error that points nowhere near the
38
+ * missing setting.
39
+ */
40
+ const centralEnv = {
41
+ ...(centralApiUrl ? { CENTRAL_API_URL: centralApiUrl } : {}),
42
+ ...(licensePublicKey ? { LICENSE_PUBLIC_KEY: licensePublicKey } : {}),
43
+ };
44
+ const dataDir = join(root, "data");
45
+ // زمن التشغيل المُجمَّع داخل الحزمة. الجهاز لا يحتاج Node مثبَّتًا (الدستور I).
46
+ const node = join(root, "runtime", "node.exe");
47
+ // أدوات الوسائط المُجمَّعة. تُمرَّر صراحةً لأن حزمتَي المُثبِّت مُستبعَدتان من شجرة كل خدمة —
48
+ // كانتا تُشحنان ثلاث مرّات (017/T034). الخدمتان ترجعان إلى حزمة المُثبِّت إن غاب المتغيّر.
49
+ const ffmpeg = join(root, "runtime", "ffmpeg.exe");
50
+ const ffprobe = join(root, "runtime", "ffprobe.exe");
51
+ const live = {
52
+ name: "live",
53
+ label: "Live service",
54
+ command: node,
55
+ args: [join(root, "live", "main.js")],
56
+ cwd: root,
57
+ env: {
58
+ LIVE_PORT: String(livePort),
59
+ LIVE_HOST: "127.0.0.1",
60
+ DATA_DIR: dataDir,
61
+ LOG_LEVEL: logLevel,
62
+ FFMPEG_PATH: ffmpeg,
63
+ FFPROBE_PATH: ffprobe,
64
+ NODE_ENV: "production",
65
+ },
66
+ host: "127.0.0.1",
67
+ port: livePort,
68
+ readiness: { kind: "http", path: "/internal/health" },
69
+ // AR: **نفس درس النواة، والخطأ نفسه كان هنا أيضًا.** عشرون ثانية بينما الإقلاع التجريبي — على
70
+ // آلة تطوير لا على عتاد عميل — قاس ‎21.9‎ و‎22.3‎ و‎27.2‎ في دورات متتالية. أي أن المهلة كانت
71
+ // **دون** الزمن المقيس فعلًا، فيفشل التثبيت بعد الهجرات ويتراجع عن نظام صحيح، والرسالة
72
+ // «الخدمات لم تبدأ» لا تسمّي خدمة ولا سببًا. الجاهزية تُستقصى فلا يكلّف الانتظار الأطول شيئًا
73
+ // حين تُقلع الخدمة في وقتها.
74
+ // EN: **The core's lesson again, and the same mistake was here too.** Twenty seconds, while the
75
+ // smoke boot — on a development machine, not customer hardware — measured 21.9, 22.3 and 27.2
76
+ // across consecutive runs. The timeout sat **below** the times actually measured, so the
77
+ // install failed after the migrations and rolled back a sound system under a "the services did
78
+ // not start" message that named neither service nor cause. Readiness is polled, so a longer
79
+ // ceiling costs nothing when the service comes up on time.
80
+ readyTimeoutMs: 60_000,
81
+ };
82
+ const core = {
83
+ name: "core",
84
+ label: "Core",
85
+ command: node,
86
+ args: [join(root, "core", "main.js")],
87
+ cwd: root,
88
+ env: {
89
+ PORT: String(corePort),
90
+ HOST: "0.0.0.0",
91
+ DATA_DIR: dataDir,
92
+ LOG_LEVEL: logLevel,
93
+ FFMPEG_PATH: ffmpeg,
94
+ FFPROBE_PATH: ffprobe,
95
+ // مجلد الحالة نفسه الذي نقرأ منه ‎config.json‎: تغيير المنفذ من لوحة التحكّم يكتبه هناك،
96
+ // فيقلع التشغيل التالي عليه. بدونه يبقى إعداد المالك محفوظًا في قاعدته وحدها ولا يُطبَّق (016).
97
+ FANTASTIC_STATE_DIR: root,
98
+ // هنا وحده تخدم النواة الواجهة كملفات ثابتة، فلا عملية ثالثة.
99
+ PORTAL_DIST: join(root, "interface", "client"),
100
+ LIVE_PORT: String(livePort),
101
+ LIVE_INTERNAL_URL: `http://127.0.0.1:${livePort}`,
102
+ NODE_ENV: "production",
103
+ // التفعيل والتحديثات: بدونهما تقلع النواة بعنوان مركزٍ افتراضيّ ومفتاحٍ عامّ فارغ.
104
+ ...centralEnv,
105
+ },
106
+ host: "0.0.0.0",
107
+ port: corePort,
108
+ readiness: { kind: "http", path: "/api/health" },
109
+ // AR: **أطول مهلة في النظام لأنها على أبطأ آلة.** كانت ٣٠ ثانية — أقلّ من مهلة جهاز التطوير (٤٥)
110
+ // ومن مهلة الإقلاع التجريبي (٦٠)، وهو ترتيب مقلوب: جهاز العميل أضعف عتادًا، وأوّل إقلاع
111
+ // عنده يحمل ما لا يحمله غيره (هجرات، زرع أوّليّ، تهيئة الصور). والإقلاع التجريبي نفسه قاس
112
+ // ‎42‎ و‎47‎ و‎52.7‎ ثانية في ثلاث دورات متتالية على آلة تطوير — أي أن الثلاثين كانت تفشل
113
+ // بفارق يسير على أيّ آلة مشغولة.
114
+ // وثمن التجاوز فادح: ‎install‎ يعدّ الخدمة ميّتة فيتراجع عن تثبيت **صحيح تمامًا** ويمحوه.
115
+ // والانتظار الأطول لا يكلّف شيئًا حين تُقلع الخدمة في وقتها: الجاهزية تُستقصى ولا تُنتظَر كاملة.
116
+ // EN: **The longest timeout in the system, because it runs on the slowest machine.** It was 30
117
+ // seconds — below the development profile's 45 and the smoke boot's 60, which is backwards:
118
+ // the customer's appliance is the weaker hardware, and its first boot carries what no other
119
+ // does (migrations, initial seeding, image preparation). The smoke boot itself measured 42,
120
+ // 47 and 52.7 seconds across three consecutive runs on a development machine — so 30 was
121
+ // failing by a narrow margin on any busy host.
122
+ // And the price of overrunning is severe: `install` reads the service as dead and rolls back a
123
+ // **perfectly correct** installation, erasing it. Waiting longer costs nothing when the service
124
+ // comes up on time: readiness is polled, not waited out.
125
+ readyTimeoutMs: 90_000,
126
+ };
127
+ return {
128
+ kind: "appliance",
129
+ root,
130
+ dataDir,
131
+ stateDir: root,
132
+ logDir: join(root, "logs"),
133
+ runDir: join(root, "run"),
134
+ services: [live, core],
135
+ };
136
+ }
137
+ //# sourceMappingURL=appliance.profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appliance.profile.js","sourceRoot":"","sources":["../../src/profiles/appliance.profile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { Profile } from "./types.js";
2
+ export interface DevProfileOptions {
3
+ /** جذر المستودع. */
4
+ root: string;
5
+ corePort: number;
6
+ livePort: number;
7
+ portalPort: number;
8
+ logLevel: string;
9
+ /**
10
+ * تجاوز مجلد البيانات. يبقى **مصدرًا واحدًا** رغم التجاوز: النواة وخدمة البث تأخذانه من هنا معًا،
11
+ * فلا يمكن أن يفترقا. وجوده يتيح تشغيل نسخة اختبار معزولة بلا مساس ببيانات التطوير القائمة.
12
+ */
13
+ dataDir?: string;
14
+ }
15
+ export declare const DEV_DEFAULTS: {
16
+ readonly corePort: 8080;
17
+ readonly livePort: 8081;
18
+ readonly portalPort: 3000;
19
+ readonly logLevel: "debug";
20
+ };
21
+ export declare function createDevProfile(options: DevProfileOptions): Profile;
22
+ //# sourceMappingURL=dev.profile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.profile.d.ts","sourceRoot":"","sources":["../../src/profiles/dev.profile.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAqB,MAAM,YAAY,CAAC;AAqB7D,MAAM,WAAW,iBAAiB;IAChC,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,YAAY;;;;;CAKf,CAAC;AAEX,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAoFpE"}
@@ -0,0 +1,104 @@
1
+ import { join, resolve } from "node:path";
2
+ // AR: ملفّ التشغيل التطويري: ثلاث عمليات تعمل من المستودع مباشرة عبر سكربتات npm الموجودة أصلًا،
3
+ // فلا يخترع الـ CLI طريقة إطلاق ثانية تنحرف عن ‎package.json‎ مع الوقت.
4
+ // EN: The development profile: three processes launched straight from the repository through the npm
5
+ // scripts that already exist, so the CLI does not invent a second launch path that drifts from
6
+ // package.json over time.
7
+ /**
8
+ * أمر منطقي لا مسار: طبقة الإطلاق تترجمه إلى استدعاء فعلي (‎node npm-cli.js‎ على ويندوز).
9
+ * ملفّ التشغيل يقول ماذا نشغّل، لا كيف يُطلق على هذا النظام.
10
+ */
11
+ const NPM = "npm";
12
+ /**
13
+ * تُثبَّت صراحةً لأن ‎apps/core/.env‎ يضبطها على ‎production‎، وبيئة العملية تتقدّم على ملف ‎.env‎ في
14
+ * NestJS. لولا التثبيت لأقلعت النواة في وضع الإنتاج أثناء التطوير: بلا ‎pino-pretty‎ وبسلوك إنتاجي
15
+ * في كل ما يفحص ‎isProduction‎. اكتُشف بالتشغيل الفعلي لا بالقراءة.
16
+ */
17
+ const DEV_NODE_ENV = "development";
18
+ export const DEV_DEFAULTS = {
19
+ corePort: 8080,
20
+ livePort: 8081,
21
+ portalPort: 3000,
22
+ logLevel: "debug",
23
+ };
24
+ export function createDevProfile(options) {
25
+ const { root, corePort, livePort, portalPort, logLevel } = options;
26
+ // مجلد بيانات النواة، مطلقًا. هذا هو **الموضع الوحيد** الذي يُقرَّر فيه مكان القاعدة في dev.
27
+ const dataDir = options.dataDir ? resolve(options.dataDir) : resolve(root, "apps/core/data");
28
+ const stateDir = join(root, ".fantastic");
29
+ // خدمة البث تقرأ قاعدة النواة نفسها. تمرير المسار المطلق المشتقّ من ‎dataDir‎ يلغي فخّ الانحراف
30
+ // الموثّق في ‎apps/live/src/config/env.schema.ts‎: خدمة فتحت ملفًا غير موجود فردّت 403 بلا تفسير.
31
+ const live = {
32
+ name: "live",
33
+ label: "Live service",
34
+ command: NPM,
35
+ args: ["run", "dev", "--workspace", "apps/live"],
36
+ cwd: root,
37
+ env: {
38
+ NODE_ENV: DEV_NODE_ENV,
39
+ LIVE_PORT: String(livePort),
40
+ LIVE_HOST: "127.0.0.1",
41
+ DATA_DIR: dataDir,
42
+ LOG_LEVEL: logLevel,
43
+ },
44
+ host: "127.0.0.1",
45
+ port: livePort,
46
+ readiness: { kind: "http", path: "/internal/health" },
47
+ readyTimeoutMs: 20_000,
48
+ };
49
+ const core = {
50
+ name: "core",
51
+ label: "Core",
52
+ command: NPM,
53
+ args: ["run", "dev", "--workspace", "apps/core"],
54
+ cwd: root,
55
+ env: {
56
+ NODE_ENV: DEV_NODE_ENV,
57
+ PORT: String(corePort),
58
+ HOST: "0.0.0.0",
59
+ DATA_DIR: dataDir,
60
+ LOG_LEVEL: logLevel,
61
+ // نفس ‎stateDir‎ الذي يقرأ منه ‎resolveProfile‎ ملفَّ ‎config.json‎: تغيير المنفذ من اللوحة
62
+ // يكتبه هناك، فيلتقطه التشغيل التالي بدل أن يبقى محفوظًا بلا أثر (016).
63
+ FANTASTIC_STATE_DIR: stateDir,
64
+ // فارغ في التطوير: Vite يقدّم الواجهة على منفذه، فلا تخدمها النواة كملفات ثابتة.
65
+ PORTAL_DIST: "",
66
+ LIVE_PORT: String(livePort),
67
+ LIVE_INTERNAL_URL: `http://127.0.0.1:${livePort}`,
68
+ },
69
+ host: "0.0.0.0",
70
+ port: corePort,
71
+ readiness: { kind: "http", path: "/api/health" },
72
+ readyTimeoutMs: 45_000,
73
+ };
74
+ // Vite لا يقدّم نقطة صحة، فاتصال TCP هو الدليل المتاح. مهلته أطول لأن أول تشغيل يبني الاعتماديات.
75
+ // ‎--port‎ يُمرَّر صراحةً لأن Vite يقرأ منفذه من ‎vite.config.ts‎ لا من البيئة؛ بدونه يصير منفذ
76
+ // الواجهة في ملفّ التشغيل زينةً لا مصدرًا، وينكسر وعد «مصدر واحد للمنافذ».
77
+ const portal = {
78
+ name: "portal",
79
+ label: "Portal",
80
+ command: NPM,
81
+ args: ["run", "dev", "--workspace", "apps/client-portal", "--", "--port", String(portalPort), "--strictPort"],
82
+ cwd: root,
83
+ env: {
84
+ NODE_ENV: DEV_NODE_ENV,
85
+ VITE_DEV_API_TARGET: `http://localhost:${corePort}`,
86
+ },
87
+ host: "0.0.0.0",
88
+ port: portalPort,
89
+ readiness: { kind: "tcp" },
90
+ readyTimeoutMs: 90_000,
91
+ };
92
+ return {
93
+ kind: "dev",
94
+ root,
95
+ dataDir,
96
+ stateDir,
97
+ logDir: join(stateDir, "logs"),
98
+ runDir: join(stateDir, "run"),
99
+ // ترتيب الإقلاع مقصود: النواة بوّابة تجيّر ‎/live/*‎ إلى 8081، فبدؤها قبل خدمة البث يفتح نافذة
100
+ // ترجع فيها كل قناة 502. الإيقاف يعكس هذا الترتيب.
101
+ services: [live, core, portal],
102
+ };
103
+ }
104
+ //# sourceMappingURL=dev.profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.profile.js","sourceRoot":"","sources":["../../src/profiles/dev.profile.ts"],"names":[],"mappings":"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"}