@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,172 @@
1
+ import { fetchLicenseStatus } from "../../probes/internal.client.js";
2
+ // AR: فحوص الترخيص (P4.4). ثلاثة أسئلة يفصلها **اختلاف العلاج** لا اختلاف الصياغة:
3
+ //
4
+ // 1. هل على هذا الجهاز رخصة أصلًا؟ → علاجه ‎fantastic activate‎
5
+ // 2. هل هي صالحة لهذا الجهاز وسارية؟ → علاجه يختلف بسبب البطلان
6
+ // 3. هل يبلغ الجهازُ المركزَ ليجدّد فحصه؟ → علاجه الشبكة لا الشركة
7
+ //
8
+ // جمعها في فحص واحد «الترخيص» كان يعطي المالكَ سطرًا أحمر بلا خطوة تالية يفهمها؛ وهذا
9
+ // بالضبط ما تمنعه قاعدةُ ‎remedy‎ الإلزامية في ‎check.types.ts‎.
10
+ //
11
+ // **والنواة المتوقّفة ‎unknown‎ لا ‎fail‎**، كما في ‎core.check.ts‎: ‎doctor‎ يُستدعى وقت العطل،
12
+ // وصبغُ هذه الفحوص حمراء يُغرق التقرير بفشلٍ مشتقّ يخفي السبب الواحد الحقيقي.
13
+ //
14
+ // EN: The licensing checks (P4.4). Three questions separated by **a difference in remedy**, not in
15
+ // wording:
16
+ //
17
+ // 1. Is there a licence on this machine at all? → the remedy is `fantastic activate`
18
+ // 2. Is it valid for this machine and in date? → the remedy depends on why it is not
19
+ // 3. Is the machine reaching the centre? → the remedy is the network, not the company
20
+ //
21
+ // Folding them into one "Licensing" check gave the owner a red line with no next step he could
22
+ // act on — exactly what the mandatory `remedy` rule in `check.types.ts` exists to prevent.
23
+ //
24
+ // **And a stopped core is `unknown`, not `fail`**, as in `core.check.ts`: `doctor` runs when
25
+ // something is broken, and painting these red floods the report with derived failures that hide
26
+ // the one real cause.
27
+ let cached;
28
+ function statusOnce(context) {
29
+ if (!cached) {
30
+ cached = {
31
+ promise: fetchLicenseStatus(context.profile).then((result) => result.ok ? { device: result.data } : { reason: result.reason }),
32
+ };
33
+ }
34
+ return cached.promise;
35
+ }
36
+ /** يُفرَغ بين التشغيلات في الاختبارات، مثل مخبأ فحوص النواة. */
37
+ export function resetLicenceCheckCache() {
38
+ cached = undefined;
39
+ }
40
+ const unknownFromCore = (reason) => ({
41
+ status: "unknown",
42
+ detail: "core unreachable",
43
+ evidence: reason,
44
+ });
45
+ export const licencePresentCheck = {
46
+ id: "licence.present",
47
+ category: "integrity",
48
+ title: "Licence file",
49
+ async run(context) {
50
+ const { device, reason } = await statusOnce(context);
51
+ if (!device)
52
+ return unknownFromCore(reason);
53
+ if (device.status === "none") {
54
+ return { status: "fail", detail: "no licence on this machine" };
55
+ }
56
+ return {
57
+ status: "pass",
58
+ detail: device.code ?? "present",
59
+ evidence: device.deviceId ? `device ${device.deviceId.slice(0, 12)}` : undefined,
60
+ };
61
+ },
62
+ remedy: (result) => result.status === "fail"
63
+ ? "Activate this appliance: fantastic activate <code>"
64
+ : "Start the core so licensing can be checked: fantastic start",
65
+ };
66
+ export const licenceValidCheck = {
67
+ id: "licence.valid",
68
+ category: "integrity",
69
+ title: "Licence validity",
70
+ async run(context) {
71
+ const { device, reason } = await statusOnce(context);
72
+ if (!device)
73
+ return unknownFromCore(reason);
74
+ switch (device.status) {
75
+ case "active":
76
+ return { status: "pass", detail: `expires ${isoDate(device.expiresAt)}` };
77
+ // AR: المهلة **تحذير لا فشل**: الخدمة تعمل بالكامل لضيوف الاستراحة الآن، والفشل الأحمر
78
+ // كان يقول للمالك إن نظامه متوقّف وهو يعمل — فيوقفه بنفسه ليصلح ما ليس معطوبًا.
79
+ // EN: Grace is a **warning, not a failure**: the service is fully working for the
80
+ // rest-house's guests right now, and a red failure told the owner his system was down
81
+ // while it was up — so he would stop it himself to fix what was not broken.
82
+ case "grace":
83
+ return {
84
+ status: "warn",
85
+ detail: `working offline · ${device.graceDaysLeft ?? "?"} days left`,
86
+ evidence: "the centre has not been reached since the last due check",
87
+ };
88
+ case "expired":
89
+ return {
90
+ status: "fail",
91
+ detail: device.expiredReason === "grace" ? "offline grace exhausted" : "licence expired",
92
+ evidence: device.expiresAt ? `valid until ${isoDate(device.expiresAt)}` : undefined,
93
+ };
94
+ case "invalid":
95
+ return { status: "fail", detail: `invalid file (${device.reason ?? "unknown"})` };
96
+ // AR: **فشلٌ بعلاجٍ مختلف تمامًا عن ‎invalid‎.** الملفّ سليم والتوقيع صحيح والبصمة
97
+ // مطابقة؛ القرار في لوحة الإدارة. و‎remedy‎ أدناه يقول «تواصل مع الدعم» لا «أعد
98
+ // التفعيل» — لأن إعادة التفعيل تُقابَل بنفس الرفض، فتضيّع ساعةً وتنتهي حيث بدأت.
99
+ // EN: **A failure whose remedy is nothing like `invalid`'s.** The file is sound, the
100
+ // signature valid, the fingerprint matching; the decision is in the dashboard. The
101
+ // `remedy` below says "contact support" rather than "re-activate" — re-activating meets
102
+ // the same refusal, wasting an hour to end where it started.
103
+ case "refused":
104
+ return {
105
+ status: "fail",
106
+ detail: `refused by the centre (${device.reason ?? "unknown"})`,
107
+ evidence: device.message,
108
+ };
109
+ case "none":
110
+ // يخصّه الفحص السابق؛ هذا لا يكرّر سطرًا أحمر عن السبب نفسه.
111
+ return { status: "unknown", detail: "not activated" };
112
+ }
113
+ },
114
+ remedy: (result) => {
115
+ if (result.detail === "offline grace exhausted") {
116
+ return "Connect this machine to the internet, then run: fantastic activate <code>";
117
+ }
118
+ if (result.detail === "licence expired") {
119
+ return "Contact Fantastic support to renew, then run: fantastic activate <code>";
120
+ }
121
+ // AR: **الرفض قبل البطلان، وعلاجه معاكس له.** المركز رفض هذا الجهاز والملفّ سليم، فلا
122
+ // شيء على الجهاز يغيّر القرار — وإعادةُ التفعيل تُقابَل بنفس الرفض حرفيًّا.
123
+ // EN: **Refusal before invalidity, and its remedy is the opposite.** The centre refused this
124
+ // appliance while its file is sound, so nothing on the machine changes the decision — and
125
+ // re-activating meets literally the same refusal.
126
+ if (result.detail?.startsWith("refused by the centre")) {
127
+ return "The centre refused this appliance. Contact Fantastic support — re-activating will not help.";
128
+ }
129
+ if (result.detail?.startsWith("invalid file (fingerprint")) {
130
+ return "This licence belongs to another machine. Re-activate here: fantastic activate <code>";
131
+ }
132
+ if (result.detail?.startsWith("invalid file")) {
133
+ return "The licence file is damaged. Re-activate: fantastic activate <code>";
134
+ }
135
+ if (result.status === "warn") {
136
+ return "Restore internet access; the appliance re-checks on its own within six hours.";
137
+ }
138
+ return "Start the core so licensing can be checked: fantastic start";
139
+ },
140
+ };
141
+ export const licenceCheckInCheck = {
142
+ id: "licence.checkin",
143
+ category: "integrity",
144
+ title: "Licence check-in",
145
+ async run(context) {
146
+ const { device, reason } = await statusOnce(context);
147
+ if (!device)
148
+ return unknownFromCore(reason);
149
+ if (device.status === "grace") {
150
+ return { status: "warn", detail: "overdue — the centre was not reached" };
151
+ }
152
+ if (device.status === "active") {
153
+ return { status: "pass", detail: "up to date" };
154
+ }
155
+ return { status: "unknown", detail: "no active licence to check in" };
156
+ },
157
+ remedy: (result) => result.status === "warn"
158
+ ? "Restore internet access; run `fantastic activate <code>` to re-check immediately."
159
+ : "Activate this appliance first: fantastic activate <code>",
160
+ };
161
+ export const licenceChecks = [
162
+ licencePresentCheck,
163
+ licenceValidCheck,
164
+ licenceCheckInCheck,
165
+ ];
166
+ function isoDate(iso) {
167
+ if (!iso)
168
+ return "unknown";
169
+ const date = new Date(iso);
170
+ return Number.isNaN(date.getTime()) ? iso : date.toISOString().slice(0, 10);
171
+ }
172
+ //# sourceMappingURL=licence.check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"licence.check.js","sourceRoot":"","sources":["../../../src/doctor/checks/licence.check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { CheckContext, DiagnosticCheck } from "../check.types.js";
2
+ /** يبني فحصًا لكل خدمة في ملفّ التشغيل، فيبقى المصدر واحدًا ولا يُكتب رقم منفذ هنا. */
3
+ export declare function portChecks(context: CheckContext): DiagnosticCheck[];
4
+ //# sourceMappingURL=ports.check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ports.check.d.ts","sourceRoot":"","sources":["../../../src/doctor/checks/ports.check.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAwDvE,uFAAuF;AACvF,wBAAgB,UAAU,CAAC,OAAO,EAAE,YAAY,GAAG,eAAe,EAAE,CAEnE"}
@@ -0,0 +1,52 @@
1
+ import { findPortHolder, isPortFree } from "../../probes/port.probe.js";
2
+ import { probeService } from "../../probes/service.probe.js";
3
+ // AR: فحص المنافذ. **منفذ محجوز ليس بالضرورة خطأً**: إن كانت خدمتنا هي من تحجزه فالنظام يعمل، وصبغُ
4
+ // ذلك أحمر إنذارٌ كاذب يدفع المستخدم إلى قتل نظام سليم.
5
+ //
6
+ // ونميّز الحالتين بسؤال الخدمة نفسها لا بمطابقة الـ PID. جُرِّبت المطابقة أوّلًا ففشلت فعليًا:
7
+ // ‎nest start --watch‎ و‎vite‎ يولّدان عمليةً ابنة هي التي تستمع، بينما سجلّ الـ PID يحمل الأب
8
+ // الذي أطلقناه — فظهرت خدمتان تعملان بصحّة تامّة على أنهما تعارضٌ حاجب. المسبار يجيب عن السؤال
9
+ // الحقيقي: «هل ما يحجز هذا المنفذ هو Fantastic يعمل؟»، وهو نفس ما يفعله ‎status‎.
10
+ // EN: Port checks. **A busy port is not necessarily wrong**: if our own service holds it the system
11
+ // is up, and painting that red is a false alarm that pushes someone to kill a healthy system.
12
+ //
13
+ // We tell them apart by asking the service, not by matching PIDs. Matching was tried first and
14
+ // failed in practice: `nest start --watch` and `vite` spawn a child that does the listening,
15
+ // while the PID record holds the parent we launched — so two perfectly healthy services were
16
+ // reported as blocking conflicts. The probe answers the real question: "is the thing holding
17
+ // this port a working Fantastic service?" — which is what `status` already does.
18
+ function portCheckFor(definition) {
19
+ return {
20
+ id: `port.${definition.name}`,
21
+ category: "ports",
22
+ title: `${definition.port} ${definition.label}`,
23
+ async run(_context) {
24
+ if (await isPortFree(definition.port, definition.host)) {
25
+ return { status: "pass", detail: "free" };
26
+ }
27
+ const probe = await probeService(definition);
28
+ if (probe.reachable) {
29
+ return { status: "pass", detail: "in use by this service", evidence: "it answered its readiness probe" };
30
+ }
31
+ const holder = await findPortHolder(definition.port);
32
+ return {
33
+ status: "fail",
34
+ detail: holder ? `held by ${holder.name}` : "busy",
35
+ evidence: holder
36
+ ? `pid ${holder.pid} — it did not answer this service's readiness probe`
37
+ : "the holding process could not be identified",
38
+ };
39
+ },
40
+ remedy: (result) => {
41
+ const pid = result.evidence?.match(/pid (\d+)/)?.[1];
42
+ const who = pid ? ` (pid ${pid})` : "";
43
+ return (`Stop whatever holds ${definition.port}${who} — "fantastic stop" if it is ours — ` +
44
+ `or move the service: fantastic config set ${definition.name}Port <free-port>`);
45
+ },
46
+ };
47
+ }
48
+ /** يبني فحصًا لكل خدمة في ملفّ التشغيل، فيبقى المصدر واحدًا ولا يُكتب رقم منفذ هنا. */
49
+ export function portChecks(context) {
50
+ return context.profile.services.map(portCheckFor);
51
+ }
52
+ //# sourceMappingURL=ports.check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ports.check.js","sourceRoot":"","sources":["../../../src/doctor/checks/ports.check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAI7D,oGAAoG;AACpG,4DAA4D;AAC5D,EAAE;AACF,mGAAmG;AACnG,mGAAmG;AACnG,mGAAmG;AACnG,sFAAsF;AACtF,oGAAoG;AACpG,kGAAkG;AAClG,EAAE;AACF,mGAAmG;AACnG,iGAAiG;AACjG,iGAAiG;AACjG,iGAAiG;AACjG,qFAAqF;AAErF,SAAS,YAAY,CAAC,UAA6B;IACjD,OAAO;QACL,EAAE,EAAE,QAAQ,UAAU,CAAC,IAAI,EAAE;QAC7B,QAAQ,EAAE,OAAO;QACjB,KAAK,EAAE,GAAG,UAAU,CAAC,IAAI,KAAK,UAAU,CAAC,KAAK,EAAE;QAChD,KAAK,CAAC,GAAG,CAAC,QAAsB;YAC9B,IAAI,MAAM,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;YAC5C,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,UAAU,CAAC,CAAC;YAC7C,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACpB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,wBAAwB,EAAE,QAAQ,EAAE,iCAAiC,EAAE,CAAC;YAC3G,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAErD,OAAO;gBACL,MAAM,EAAE,MAAM;gBACd,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM;gBAClD,QAAQ,EAAE,MAAM;oBACd,CAAC,CAAC,OAAO,MAAM,CAAC,GAAG,qDAAqD;oBACxE,CAAC,CAAC,6CAA6C;aAClD,CAAC;QACJ,CAAC;QACD,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE;YACjB,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACrD,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAEvC,OAAO,CACL,uBAAuB,UAAU,CAAC,IAAI,GAAG,GAAG,sCAAsC;gBAClF,6CAA6C,UAAU,CAAC,IAAI,kBAAkB,CAC/E,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,UAAU,CAAC,OAAqB;IAC9C,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AACpD,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { DiagnosticCheck } from "../check.types.js";
2
+ export declare const supervisorAliveCheck: DiagnosticCheck;
3
+ export declare const bootTaskCheck: DiagnosticCheck;
4
+ export declare const restartLoopCheck: DiagnosticCheck;
5
+ /**
6
+ * AR: «يعمل لكنه محجوب» (٠٢٠/FR-027). الحالة التي يعالجها هذا الفحص لا يمكن لأيّ طرف وحده أن
7
+ * يراها: النواة تعرف أن المستمع مفتوح ولا تعرف حال الجدار من منظور من يتصل، ونظام التشغيل
8
+ * يعرف القاعدة ولا يعرف إن كان الـ FTP مشغَّلًا أصلًا. فيُجمَع النصفان هنا.
9
+ * ولا شيء يُقال حين يكون الـ FTP مطفأً: إنذارٌ عن ميزة لم تُشغَّل يعلّم قارئه تجاهل الإنذارات.
10
+ * EN: "Running but blocked" (020/FR-027). The state this check catches is invisible to either side
11
+ * alone: the core knows its listener is open but not how the firewall looks from a client's
12
+ * side, and the operating system knows the rule but not whether FTP is even switched on. The two
13
+ * halves are joined here.
14
+ * And nothing is said while FTP is off: an alert about a feature nobody enabled teaches its
15
+ * reader to ignore alerts.
16
+ */
17
+ export declare const ftpReachableCheck: DiagnosticCheck;
18
+ export declare const supervisorChecks: DiagnosticCheck[];
19
+ //# sourceMappingURL=supervisor.check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supervisor.check.d.ts","sourceRoot":"","sources":["../../../src/doctor/checks/supervisor.check.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAA6B,eAAe,EAAE,MAAM,mBAAmB,CAAC;AA0CpF,eAAO,MAAM,oBAAoB,EAAE,eA0BlC,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,eAmB3B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,eAqB9B,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,iBAAiB,EAAE,eAgC/B,CAAC;AAKF,eAAO,MAAM,gBAAgB,EAAE,eAAe,EAK7C,CAAC"}
@@ -0,0 +1,152 @@
1
+ import { existsSync } from "node:fs";
2
+ import { isBootTaskInstalled } from "../../packaging/boot-task.js";
3
+ import { getInternal } from "../../probes/internal.client.js";
4
+ import { INTERNAL_PATHS } from "../../probes/internal-paths.js";
5
+ import { REMOTE_STATE_FILES, readStateJson, stateFilePath } from "../../supervisor/state-files.js";
6
+ // AR: فحوص المشرف (٠٢٠/US1، T016).
7
+ //
8
+ // ثلاثة أسئلة يجيب عنها ‎doctor‎ ولا يجيبها أحد سواه:
9
+ // ١ — **هل هناك مشرف حيّ؟** بدونه لا شيء يُحيي خدمةً ماتت ولا ينفّذ جدولًا ولا يستهلك طلب إعادة
10
+ // تشغيل. النظام يبدو سليمًا تمامًا وهو بلا شبكة أمان.
11
+ // ٢ — **هل تعود الآلة بعد انقطاع الكهرباء؟** أي: هل مهمة الإقلاع مسجّلة. الجواب لا يُعرف إلّا
12
+ // بسؤال ويندوز، ولذلك يعيش هنا لا في النواة (النواة ممنوعة من تشغيل عملية).
13
+ // ٣ — **هل توقّف الإحياء عند دورة متكرّرة؟** وجود ‎restart-loop.json‎ يعني خدمةً ماتت ثلاث مرّات
14
+ // في عشر دقائق فتُركت. هذا **فشل حاجب**: الجهاز يعمل ناقصًا، وصمتُنا عنه يحوّل عطلًا واضحًا
15
+ // إلى لغز.
16
+ //
17
+ // **والقِدَم غياب.** نبضٌ عمره ساعة يقول «حيّ» بينما لا أحد هناك. الطابع هو الدليل، لا الملفّ.
18
+ //
19
+ // EN: The supervisor checks (020/US1, T016).
20
+ //
21
+ // Three questions `doctor` answers and nothing else does:
22
+ // 1 — **Is a supervisor alive?** Without one nothing revives a dead service, runs a schedule, or
23
+ // consumes a restart request. The system looks entirely healthy while having no safety net.
24
+ // 2 — **Will the machine come back after a power cut?** That is: is the boot task registered.
25
+ // The answer can only be had by asking Windows, which is why it lives here and not in the
26
+ // core (the core may not run a process).
27
+ // 3 — **Did revival stop on a repeating loop?** The presence of `restart-loop.json` means a
28
+ // service died three times in ten minutes and was left alone. That is a **blocking
29
+ // failure**: the appliance is running incomplete, and staying quiet about it turns an
30
+ // obvious fault into a mystery.
31
+ //
32
+ // **And staleness is absence.** An hour-old heartbeat says "alive" while nobody is there. The
33
+ // stamp is the evidence, not the file.
34
+ /** بعده يُعدّ النبض قديمًا. نفس القيمة التي تقرأ بها النواة الملفّ — ولا يجوز أن تتباعدا. */
35
+ const HEARTBEAT_STALE_MS = 90_000;
36
+ function readSupervisor(context) {
37
+ const status = readStateJson(context.profile, REMOTE_STATE_FILES.supervisor);
38
+ if (!status)
39
+ return null;
40
+ const age = Date.now() - Date.parse(status.updatedAt);
41
+ return Number.isFinite(age) && age <= HEARTBEAT_STALE_MS ? status : null;
42
+ }
43
+ export const supervisorAliveCheck = {
44
+ id: "supervisor.alive",
45
+ category: "data",
46
+ title: "Supervisor",
47
+ async run(context) {
48
+ const status = readSupervisor(context);
49
+ if (status) {
50
+ const uptime = Math.max(0, Math.round((Date.now() - Date.parse(status.startedAt)) / 60_000));
51
+ return { status: "pass", detail: `running · pid ${status.pid}`, evidence: `up for ${uptime} minute(s)` };
52
+ }
53
+ const path = stateFilePath(context.profile, REMOTE_STATE_FILES.supervisor);
54
+ // AR: **تحذير لا فشل.** الجهاز يقدّم المحتوى للضيوف بلا مشرف تمامًا؛ ما يفقده هو التعافي
55
+ // الذاتي والجدول. صبغُه أحمر كان سيجعل كل تشغيل تطويريّ يبدو معطوبًا.
56
+ // EN: **A warning, not a failure.** The appliance serves guests perfectly well with no
57
+ // supervisor; what it loses is self-healing and the schedule. Painting it red would make
58
+ // every development run look broken.
59
+ return {
60
+ status: "warn",
61
+ detail: existsSync(path) ? "not running (stale heartbeat)" : "not running",
62
+ evidence: "nothing will revive a stopped service or run the restart schedule",
63
+ };
64
+ },
65
+ remedy: () => "Start it: fantastic watch · it is registered to start at boot by: fantastic install",
66
+ };
67
+ export const bootTaskCheck = {
68
+ id: "supervisor.boot-task",
69
+ category: "environment",
70
+ title: "Restart after power loss",
71
+ async run() {
72
+ if (process.platform !== "win32") {
73
+ return { status: "unknown", detail: "only on Windows" };
74
+ }
75
+ return (await isBootTaskInstalled())
76
+ ? { status: "pass", detail: "the boot task is registered" }
77
+ : {
78
+ status: "warn",
79
+ detail: "no boot task",
80
+ evidence: "after a power cut the appliance stays dark until someone starts it by hand",
81
+ };
82
+ },
83
+ remedy: () => "Register it by reinstalling from an administrator terminal: fantastic install --from <bundle> · until then, the machine-restart action stays disabled",
84
+ };
85
+ export const restartLoopCheck = {
86
+ id: "supervisor.restart-loop",
87
+ category: "integrity",
88
+ title: "Restart loop",
89
+ async run(context) {
90
+ const loop = readStateJson(context.profile, REMOTE_STATE_FILES.restartLoop);
91
+ if (!loop)
92
+ return { status: "pass", detail: "none" };
93
+ return {
94
+ status: "fail",
95
+ detail: `${loop.service} was left stopped`,
96
+ evidence: `it failed ${loop.attempts} times in ${loop.windowMinutes} minutes, last at ${loop.stoppedAt}`,
97
+ };
98
+ },
99
+ remedy: (result, context) => {
100
+ const service = result.detail?.split(" ")[0] ?? "the service";
101
+ return (`Read why it dies: fantastic logs ${service} -n 80 · fix the cause, then: fantastic start ` +
102
+ `· the alert clears itself once it answers again (or delete ${stateFilePath(context.profile, REMOTE_STATE_FILES.restartLoop)})`);
103
+ },
104
+ };
105
+ /**
106
+ * AR: «يعمل لكنه محجوب» (٠٢٠/FR-027). الحالة التي يعالجها هذا الفحص لا يمكن لأيّ طرف وحده أن
107
+ * يراها: النواة تعرف أن المستمع مفتوح ولا تعرف حال الجدار من منظور من يتصل، ونظام التشغيل
108
+ * يعرف القاعدة ولا يعرف إن كان الـ FTP مشغَّلًا أصلًا. فيُجمَع النصفان هنا.
109
+ * ولا شيء يُقال حين يكون الـ FTP مطفأً: إنذارٌ عن ميزة لم تُشغَّل يعلّم قارئه تجاهل الإنذارات.
110
+ * EN: "Running but blocked" (020/FR-027). The state this check catches is invisible to either side
111
+ * alone: the core knows its listener is open but not how the firewall looks from a client's
112
+ * side, and the operating system knows the rule but not whether FTP is even switched on. The two
113
+ * halves are joined here.
114
+ * And nothing is said while FTP is off: an alert about a feature nobody enabled teaches its
115
+ * reader to ignore alerts.
116
+ */
117
+ export const ftpReachableCheck = {
118
+ id: "remote.ftp",
119
+ category: "ports",
120
+ title: "FTP server",
121
+ async run(context) {
122
+ const state = await getInternal(context.profile, INTERNAL_PATHS.REMOTE_FTP);
123
+ // النواة متوقّفة: «غير معروف» لا فشل — نفس قاعدة فحوص النواة، فلا يغرق التقرير بفشل مشتقّ.
124
+ if (!state.ok)
125
+ return { status: "unknown", detail: "core unreachable" };
126
+ if (!state.data.enabled)
127
+ return { status: "pass", detail: "off" };
128
+ if (state.data.status === "failed") {
129
+ return { status: "fail", detail: "enabled but not listening", evidence: "the dashboard shows the reason" };
130
+ }
131
+ if (process.platform === "win32" && !state.data.firewallRule) {
132
+ return {
133
+ status: "fail",
134
+ detail: `listening on ${state.data.port} but the firewall rule is missing`,
135
+ evidence: "clients on the LAN will time out while the panel says it is running",
136
+ };
137
+ }
138
+ return { status: "pass", detail: `listening on ${state.data.port}` };
139
+ },
140
+ remedy: (result) => result.detail?.includes("firewall")
141
+ ? `Re-save the FTP settings from the dashboard to re-add the rule, or add it by hand from an administrator terminal: netsh advfirewall firewall add rule name="${FIREWALL_RULE}" dir=in action=allow protocol=TCP localport=<port> profile=private`
142
+ : "Open the Remote screen in the dashboard — the FTP card states why it did not start.",
143
+ };
144
+ /** نفس اسم القاعدة التي تكتبها النواة. مكتوب هنا لأن الـ CLI لا يستورد من النواة. */
145
+ const FIREWALL_RULE = "Fantastic FTP";
146
+ export const supervisorChecks = [
147
+ supervisorAliveCheck,
148
+ bootTaskCheck,
149
+ restartLoopCheck,
150
+ ftpReachableCheck,
151
+ ];
152
+ //# sourceMappingURL=supervisor.check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supervisor.check.js","sourceRoot":"","sources":["../../../src/doctor/checks/supervisor.check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { DiagnosticCheck } from "../check.types.js";
2
+ export declare const toolingChecks: DiagnosticCheck[];
3
+ //# sourceMappingURL=tooling.check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tooling.check.d.ts","sourceRoot":"","sources":["../../../src/doctor/checks/tooling.check.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAe,eAAe,EAAE,MAAM,mBAAmB,CAAC;AA8DtE,eAAO,MAAM,aAAa,EAAE,eAAe,EAAgD,CAAC"}
@@ -0,0 +1,43 @@
1
+ import { existsSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { execa } from "execa";
4
+ /**
5
+ * أين يقع الثنائي في كل ملفّ تشغيل. في الجهاز المركّب تُنسَخ الأدوات إلى ‎runtime/‎ باسم ثابت،
6
+ * وفي المستودع تأتي من حزمة المُثبِّت.
7
+ */
8
+ function candidatePaths(profile, tool) {
9
+ if (profile.kind === "appliance")
10
+ return [join(profile.root, "runtime", `${tool}.exe`)];
11
+ const installer = tool === "ffmpeg" ? "@ffmpeg-installer" : "@ffprobe-installer";
12
+ return [join(profile.root, "node_modules", installer, "win32-x64", `${tool}.exe`)];
13
+ }
14
+ async function probeTool(profile, tool) {
15
+ const candidates = candidatePaths(profile, tool);
16
+ const found = candidates.find((candidate) => existsSync(candidate));
17
+ if (!found) {
18
+ return { status: "fail", detail: "missing", evidence: `looked in: ${candidates.join(", ")}` };
19
+ }
20
+ try {
21
+ const { stdout } = await execa(found, ["-version"], { timeout: 10_000 });
22
+ // أول رمز بعد "ffmpeg version" هو رقم النسخة؛ نأخذه للعرض ولا نحلّله أكثر.
23
+ const version = stdout.split(/\s+/)[2] ?? "unknown";
24
+ return { status: "pass", detail: version, evidence: found };
25
+ }
26
+ catch {
27
+ // موجود ولا يعمل: أسوأ من الغياب لأنه يمرّ بفحص الوجود ويفشل وقت التشغيل.
28
+ return { status: "fail", detail: "present but does not run", evidence: found };
29
+ }
30
+ }
31
+ function toolCheck(tool) {
32
+ return {
33
+ id: `tooling.${tool}`,
34
+ category: "tooling",
35
+ title: tool,
36
+ run: ({ profile }) => probeTool(profile, tool),
37
+ remedy: (_result, { profile }) => profile.kind === "appliance"
38
+ ? `Reinstall the bundle — ${tool}.exe ships inside it at runtime\\${tool}.exe and must not be removed.`
39
+ : `Run "npm install" at the repository root; ${tool} ships as a prebuilt installer package.`,
40
+ };
41
+ }
42
+ export const toolingChecks = [toolCheck("ffmpeg"), toolCheck("ffprobe")];
43
+ //# sourceMappingURL=tooling.check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tooling.check.js","sourceRoot":"","sources":["../../../src/doctor/checks/tooling.check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAoB9B;;;GAGG;AACH,SAAS,cAAc,CAAC,OAAgB,EAAE,IAAU;IAClD,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC;IAExF,MAAM,SAAS,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,oBAAoB,CAAC;IACjF,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC;AACrF,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,OAAgB,EAAE,IAAU;IACnD,MAAM,UAAU,GAAG,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;IAEpE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;IAChG,CAAC;IAED,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACzE,2EAA2E;QAC3E,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;QACpD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,0EAA0E;QAC1E,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,0BAA0B,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACjF,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,IAAU;IAC3B,OAAO;QACL,EAAE,EAAE,WAAW,IAAI,EAAE;QACrB,QAAQ,EAAE,SAAS;QACnB,KAAK,EAAE,IAAI;QACX,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC;QAC9C,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAC/B,OAAO,CAAC,IAAI,KAAK,WAAW;YAC1B,CAAC,CAAC,0BAA0B,IAAI,oCAAoC,IAAI,+BAA+B;YACvG,CAAC,CAAC,6CAA6C,IAAI,yCAAyC;KACjG,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAsB,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { CheckContext, CheckOutcome, DiagnosticCheck } from "./check.types.js";
2
+ export declare function buildRegistry(context: CheckContext): DiagnosticCheck[];
3
+ export interface DoctorReport {
4
+ outcomes: CheckOutcome[];
5
+ /** عدد الفحوص الحاجبة. يقرّر رمز الخروج. */
6
+ blocking: number;
7
+ warnings: number;
8
+ unknown: number;
9
+ }
10
+ /**
11
+ * ينفّذ الفحوص **بالتتابع** لا بالتوازي. الأمر قصير أصلًا، والتتابع يبقي المخرَج مرتّبًا كما كُتب
12
+ * ويمنع ازدحام عدّة استعلامات PowerShell على المنافذ في آنٍ واحد.
13
+ */
14
+ export declare function runDoctor(context: CheckContext): Promise<DoctorReport>;
15
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/doctor/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAmBpF,wBAAgB,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,eAAe,EAAE,CAetE;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,4CAA4C;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAmB5E"}
@@ -0,0 +1,53 @@
1
+ import { isBlocking } from "./check.types.js";
2
+ import { environmentChecks } from "./checks/environment.check.js";
3
+ import { isolationChecks } from "./checks/isolation.check.js";
4
+ import { portChecks } from "./checks/ports.check.js";
5
+ import { toolingChecks } from "./checks/tooling.check.js";
6
+ import { dataChecks } from "./checks/data.check.js";
7
+ import { coreChecks, resetCoreCheckCache } from "./checks/core.check.js";
8
+ import { supervisorChecks } from "./checks/supervisor.check.js";
9
+ import { integrityChecks } from "./checks/integrity.check.js";
10
+ import { licenceChecks, resetLicenceCheckCache } from "./checks/licence.check.js";
11
+ // AR: يجمّع الفحوص وينفّذها. الترتيب مقصود: البيئة ثم المنافذ ثم الأدوات ثم البيانات ثم السلامة —
12
+ // من الأقرب إلى المستخدم إلى الأعمق، فيقرأ السبب الجذري قبل أعراضه.
13
+ // داخل فئة البيانات يأتي «هل النواة تعمل» أوّلًا لأن ما بعده مشتقّ منه.
14
+ // EN: Assembles and runs the checks. The order is deliberate: environment, ports, tooling, data,
15
+ // integrity — nearest to the user first, so a root cause is read before its symptoms. Inside the
16
+ // data category "is the core up" comes first because everything after it derives from that.
17
+ export function buildRegistry(context) {
18
+ return [
19
+ ...environmentChecks,
20
+ // العزل ضمن البيئة وبعدها مباشرة: هو أيضًا سؤال «على أي أرض نقف»، وجوابه يسبق كل ما بعده.
21
+ ...isolationChecks,
22
+ ...portChecks(context),
23
+ ...toolingChecks,
24
+ ...dataChecks,
25
+ ...coreChecks,
26
+ // بعد فحوص النواة: «من يُحييها إن ماتت» سؤالٌ يلي «هل هي حيّة»، لا يسبقه (٠٢٠/T016).
27
+ ...supervisorChecks,
28
+ ...integrityChecks,
29
+ // الترخيص آخرًا (P4.4): جوابه مشتقّ من كون النواة حيّة، فلا يسبق الفحص الذي يقرّر ذلك.
30
+ ...licenceChecks,
31
+ ];
32
+ }
33
+ /**
34
+ * ينفّذ الفحوص **بالتتابع** لا بالتوازي. الأمر قصير أصلًا، والتتابع يبقي المخرَج مرتّبًا كما كُتب
35
+ * ويمنع ازدحام عدّة استعلامات PowerShell على المنافذ في آنٍ واحد.
36
+ */
37
+ export async function runDoctor(context) {
38
+ resetCoreCheckCache();
39
+ resetLicenceCheckCache();
40
+ const outcomes = [];
41
+ for (const check of buildRegistry(context)) {
42
+ const result = await check.run(context);
43
+ const remedy = result.status === "pass" ? undefined : check.remedy(result, context) || undefined;
44
+ outcomes.push({ check, result, remedy });
45
+ }
46
+ return {
47
+ outcomes,
48
+ blocking: outcomes.filter((outcome) => isBlocking(outcome.result)).length,
49
+ warnings: outcomes.filter((outcome) => outcome.result.status === "warn").length,
50
+ unknown: outcomes.filter((outcome) => outcome.result.status === "unknown").length,
51
+ };
52
+ }
53
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/doctor/registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAElF,kGAAkG;AAClG,wEAAwE;AACxE,4EAA4E;AAC5E,iGAAiG;AACjG,qGAAqG;AACrG,gGAAgG;AAEhG,MAAM,UAAU,aAAa,CAAC,OAAqB;IACjD,OAAO;QACL,GAAG,iBAAiB;QACpB,0FAA0F;QAC1F,GAAG,eAAe;QAClB,GAAG,UAAU,CAAC,OAAO,CAAC;QACtB,GAAG,aAAa;QAChB,GAAG,UAAU;QACb,GAAG,UAAU;QACb,qFAAqF;QACrF,GAAG,gBAAgB;QACnB,GAAG,eAAe;QAClB,uFAAuF;QACvF,GAAG,aAAa;KACjB,CAAC;AACJ,CAAC;AAUD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAqB;IACnD,mBAAmB,EAAE,CAAC;IACtB,sBAAsB,EAAE,CAAC;IAEzB,MAAM,QAAQ,GAAmB,EAAE,CAAC;IAEpC,KAAK,MAAM,KAAK,IAAI,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,SAAS,CAAC;QAEjG,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO;QACL,QAAQ;QACR,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;QACzE,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM;QAC/E,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM;KAClF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ export declare const EXIT: {
2
+ /** نجاح. */
3
+ readonly OK: 0;
4
+ /** فشل عام لا يندرج تحت ما بعده. */
5
+ readonly FAILURE: 1;
6
+ /** خطأ استخدام: عَلَم مجهول أو وسيط ناقص. يولّده oclif نفسه. */
7
+ readonly USAGE: 2;
8
+ /** تعارض منفذ: المنفذ محجوز ومن يحجزه معروف. */
9
+ readonly PORT_CONFLICT: 3;
10
+ /** الخدمة لا تستجيب: حيّة كعملية، غير جاهزة كخدمة. الفرق يغيّر العلاج. */
11
+ readonly UNREACHABLE: 4;
12
+ /** لم يُحلّ ملفّ التشغيل: لا مستودع هنا ولا جهاز مركّب. */
13
+ readonly NO_PROFILE: 5;
14
+ /** ‎doctor‎ وجد عائقًا حاجبًا. مميَّز عن الفشل العام: التشخيص **نجح** ووجد مشكلة. */
15
+ readonly DIAGNOSTIC_BLOCKED: 6;
16
+ };
17
+ export type ExitCode = (typeof EXIT)[keyof typeof EXIT];
18
+ //# sourceMappingURL=exit-codes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exit-codes.d.ts","sourceRoot":"","sources":["../src/exit-codes.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,IAAI;IACf,YAAY;;IAEZ,oCAAoC;;IAEpC,gEAAgE;;IAEhE,gDAAgD;;IAEhD,0EAA0E;;IAE1E,2DAA2D;;IAE3D,qFAAqF;;CAE7E,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC,MAAM,OAAO,IAAI,CAAC,CAAC"}
@@ -0,0 +1,23 @@
1
+ // AR: عقد رموز الخروج (017/FR-032). ليست تفصيلًا داخليًا بل **واجهة**: سكربت بوّابة يفرّق بها بين
2
+ // «المنفذ محجوز» و«التشخيص وجد عائقًا» دون أن يحلّل نصًّا إنجليزيًا. لذلك تعيش في ملف مستقلّ
3
+ // يستورده الأمر والعارضة معًا، لا داخل أحدهما.
4
+ // EN: The exit-code contract (017/FR-032). Not an internal detail but an **interface**: a gate
5
+ // script distinguishes "the port was busy" from "diagnosis found a blocker" without parsing
6
+ // English prose. Hence its own file, imported by commands and renderers alike.
7
+ export const EXIT = {
8
+ /** نجاح. */
9
+ OK: 0,
10
+ /** فشل عام لا يندرج تحت ما بعده. */
11
+ FAILURE: 1,
12
+ /** خطأ استخدام: عَلَم مجهول أو وسيط ناقص. يولّده oclif نفسه. */
13
+ USAGE: 2,
14
+ /** تعارض منفذ: المنفذ محجوز ومن يحجزه معروف. */
15
+ PORT_CONFLICT: 3,
16
+ /** الخدمة لا تستجيب: حيّة كعملية، غير جاهزة كخدمة. الفرق يغيّر العلاج. */
17
+ UNREACHABLE: 4,
18
+ /** لم يُحلّ ملفّ التشغيل: لا مستودع هنا ولا جهاز مركّب. */
19
+ NO_PROFILE: 5,
20
+ /** ‎doctor‎ وجد عائقًا حاجبًا. مميَّز عن الفشل العام: التشخيص **نجح** ووجد مشكلة. */
21
+ DIAGNOSTIC_BLOCKED: 6,
22
+ };
23
+ //# sourceMappingURL=exit-codes.js.map