@selvajs/selva 2.0.7 → 2.0.8

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 (221) hide show
  1. package/build/client/_app/immutable/chunks/{D_att4ap.js → B0M-tm96.js} +1 -1
  2. package/build/client/_app/immutable/chunks/B0M-tm96.js.br +0 -0
  3. package/build/client/_app/immutable/chunks/B0M-tm96.js.gz +0 -0
  4. package/build/client/_app/immutable/chunks/{Bil3tPvX.js → Ba2Ugq_t.js} +1 -1
  5. package/build/client/_app/immutable/chunks/Ba2Ugq_t.js.br +0 -0
  6. package/build/client/_app/immutable/chunks/Ba2Ugq_t.js.gz +0 -0
  7. package/build/client/_app/immutable/chunks/{CqsZL3G3.js → BldLEHH8.js} +1 -1
  8. package/build/client/_app/immutable/chunks/BldLEHH8.js.br +0 -0
  9. package/build/client/_app/immutable/chunks/BldLEHH8.js.gz +0 -0
  10. package/build/client/_app/immutable/chunks/{ljBlCROD.js → BnGN4Ix-.js} +1 -1
  11. package/build/client/_app/immutable/chunks/BnGN4Ix-.js.br +0 -0
  12. package/build/client/_app/immutable/chunks/BnGN4Ix-.js.gz +0 -0
  13. package/build/client/_app/immutable/chunks/CnbBd0os.js +3 -0
  14. package/build/client/_app/immutable/chunks/CnbBd0os.js.br +0 -0
  15. package/build/client/_app/immutable/chunks/CnbBd0os.js.gz +0 -0
  16. package/build/client/_app/immutable/chunks/{DHlGhLx2.js → CyUe9WIm.js} +1 -1
  17. package/build/client/_app/immutable/chunks/CyUe9WIm.js.br +0 -0
  18. package/build/client/_app/immutable/chunks/CyUe9WIm.js.gz +0 -0
  19. package/build/client/_app/immutable/entry/{app.mgpIphLA.js → app.R0cA7z-3.js} +2 -2
  20. package/build/client/_app/immutable/entry/app.R0cA7z-3.js.br +0 -0
  21. package/build/client/_app/immutable/entry/app.R0cA7z-3.js.gz +0 -0
  22. package/build/client/_app/immutable/entry/start.DuuVgzCE.js +1 -0
  23. package/build/client/_app/immutable/entry/start.DuuVgzCE.js.br +0 -0
  24. package/build/client/_app/immutable/entry/start.DuuVgzCE.js.gz +0 -0
  25. package/build/client/_app/immutable/nodes/{1.ER8kCa8u.js → 1.iTQblN3h.js} +1 -1
  26. package/build/client/_app/immutable/nodes/1.iTQblN3h.js.br +0 -0
  27. package/build/client/_app/immutable/nodes/1.iTQblN3h.js.gz +0 -0
  28. package/build/client/_app/immutable/nodes/{11.etqQMTbZ.js → 11.D7vQOfVW.js} +1 -1
  29. package/build/client/_app/immutable/nodes/11.D7vQOfVW.js.br +0 -0
  30. package/build/client/_app/immutable/nodes/11.D7vQOfVW.js.gz +0 -0
  31. package/build/client/_app/immutable/nodes/{13.D2C7ZhRM.js → 13.CEGRwaw5.js} +1 -1
  32. package/build/client/_app/immutable/nodes/13.CEGRwaw5.js.br +0 -0
  33. package/build/client/_app/immutable/nodes/13.CEGRwaw5.js.gz +0 -0
  34. package/build/client/_app/immutable/nodes/{14.BsMD1FMo.js → 14.DP0RHUIL.js} +1 -1
  35. package/build/client/_app/immutable/nodes/14.DP0RHUIL.js.br +0 -0
  36. package/build/client/_app/immutable/nodes/14.DP0RHUIL.js.gz +0 -0
  37. package/build/client/_app/immutable/nodes/{15.BZg0-72V.js → 15.C5BZvt5A.js} +11 -11
  38. package/build/client/_app/immutable/nodes/15.C5BZvt5A.js.br +0 -0
  39. package/build/client/_app/immutable/nodes/15.C5BZvt5A.js.gz +0 -0
  40. package/build/client/_app/immutable/nodes/{16.CNZK2Sd5.js → 16.ChhIZf_i.js} +1 -1
  41. package/build/client/_app/immutable/nodes/16.ChhIZf_i.js.br +0 -0
  42. package/build/client/_app/immutable/nodes/16.ChhIZf_i.js.gz +0 -0
  43. package/build/client/_app/immutable/nodes/{17.DnbXph3_.js → 17.DL0oF7lP.js} +1 -1
  44. package/build/client/_app/immutable/nodes/17.DL0oF7lP.js.br +0 -0
  45. package/build/client/_app/immutable/nodes/17.DL0oF7lP.js.gz +0 -0
  46. package/build/client/_app/immutable/nodes/{19.DUkWoiIb.js → 19.CCJMnv49.js} +1 -1
  47. package/build/client/_app/immutable/nodes/19.CCJMnv49.js.br +0 -0
  48. package/build/client/_app/immutable/nodes/19.CCJMnv49.js.gz +0 -0
  49. package/build/client/_app/immutable/nodes/{2.Cpz-Tpy2.js → 2.wQUgS03u.js} +1 -1
  50. package/build/client/_app/immutable/nodes/2.wQUgS03u.js.br +0 -0
  51. package/build/client/_app/immutable/nodes/2.wQUgS03u.js.gz +0 -0
  52. package/build/client/_app/immutable/nodes/{20.DBQniFEt.js → 20.De0vu3AF.js} +1 -1
  53. package/build/client/_app/immutable/nodes/20.De0vu3AF.js.br +0 -0
  54. package/build/client/_app/immutable/nodes/20.De0vu3AF.js.gz +0 -0
  55. package/build/client/_app/immutable/nodes/{21.DWPqhlKJ.js → 21.DpNlPoKj.js} +1 -1
  56. package/build/client/_app/immutable/nodes/21.DpNlPoKj.js.br +0 -0
  57. package/build/client/_app/immutable/nodes/21.DpNlPoKj.js.gz +0 -0
  58. package/build/client/_app/immutable/nodes/{23.CDmYEi90.js → 23.CMmwabln.js} +1 -1
  59. package/build/client/_app/immutable/nodes/23.CMmwabln.js.br +0 -0
  60. package/build/client/_app/immutable/nodes/23.CMmwabln.js.gz +0 -0
  61. package/build/client/_app/immutable/nodes/{24.Cry95nKW.js → 24.CuYhfWpg.js} +1 -1
  62. package/build/client/_app/immutable/nodes/24.CuYhfWpg.js.br +0 -0
  63. package/build/client/_app/immutable/nodes/24.CuYhfWpg.js.gz +0 -0
  64. package/build/client/_app/immutable/nodes/{27.CDltPd6D.js → 27.xAPzIANf.js} +1 -1
  65. package/build/client/_app/immutable/nodes/27.xAPzIANf.js.br +0 -0
  66. package/build/client/_app/immutable/nodes/27.xAPzIANf.js.gz +0 -0
  67. package/build/client/_app/immutable/nodes/{28.HXbeDTJx.js → 28.DwzOZwKl.js} +1 -1
  68. package/build/client/_app/immutable/nodes/28.DwzOZwKl.js.br +0 -0
  69. package/build/client/_app/immutable/nodes/28.DwzOZwKl.js.gz +0 -0
  70. package/build/client/_app/immutable/nodes/{29.B9r1wv_8.js → 29.8CK2Warj.js} +1 -1
  71. package/build/client/_app/immutable/nodes/29.8CK2Warj.js.br +0 -0
  72. package/build/client/_app/immutable/nodes/29.8CK2Warj.js.gz +0 -0
  73. package/build/client/_app/immutable/nodes/{3.D4JVLXS4.js → 3.CRsFANhR.js} +1 -1
  74. package/build/client/_app/immutable/nodes/3.CRsFANhR.js.br +0 -0
  75. package/build/client/_app/immutable/nodes/3.CRsFANhR.js.gz +0 -0
  76. package/build/client/_app/immutable/nodes/{30.Bv8cJH8I.js → 30.Cj-Aax_q.js} +1 -1
  77. package/build/client/_app/immutable/nodes/30.Cj-Aax_q.js.br +0 -0
  78. package/build/client/_app/immutable/nodes/30.Cj-Aax_q.js.gz +0 -0
  79. package/build/client/_app/immutable/nodes/{5.89J4ek9w.js → 5.CtPFMefZ.js} +1 -1
  80. package/build/client/_app/immutable/nodes/5.CtPFMefZ.js.br +0 -0
  81. package/build/client/_app/immutable/nodes/5.CtPFMefZ.js.gz +0 -0
  82. package/build/client/_app/immutable/nodes/{6.DEn0bSbE.js → 6.DpMqwqL2.js} +1 -1
  83. package/build/client/_app/immutable/nodes/6.DpMqwqL2.js.br +0 -0
  84. package/build/client/_app/immutable/nodes/6.DpMqwqL2.js.gz +0 -0
  85. package/build/client/_app/immutable/nodes/{7.D1Yc2D4z.js → 7.B8Lrh4Sn.js} +1 -1
  86. package/build/client/_app/immutable/nodes/7.B8Lrh4Sn.js.br +0 -0
  87. package/build/client/_app/immutable/nodes/7.B8Lrh4Sn.js.gz +0 -0
  88. package/build/client/_app/immutable/nodes/{8.BAgBqrSM.js → 8.BpnmUNwu.js} +1 -1
  89. package/build/client/_app/immutable/nodes/8.BpnmUNwu.js.br +0 -0
  90. package/build/client/_app/immutable/nodes/8.BpnmUNwu.js.gz +0 -0
  91. package/build/client/_app/immutable/nodes/9.-tjBCa1C.js +1 -0
  92. package/build/client/_app/immutable/nodes/9.-tjBCa1C.js.br +0 -0
  93. package/build/client/_app/immutable/nodes/9.-tjBCa1C.js.gz +0 -0
  94. package/build/client/_app/version.json +1 -1
  95. package/build/client/_app/version.json.br +0 -0
  96. package/build/client/_app/version.json.gz +0 -0
  97. package/build/server/chunks/{1-DaLSXFO5.js → 1-CSxxdOGx.js} +2 -2
  98. package/build/server/chunks/{1-DaLSXFO5.js.map → 1-CSxxdOGx.js.map} +1 -1
  99. package/build/server/chunks/{11-CHgqcTbh.js → 11-DPGyzjwV.js} +2 -2
  100. package/build/server/chunks/{11-CHgqcTbh.js.map → 11-DPGyzjwV.js.map} +1 -1
  101. package/build/server/chunks/{13-NcfCvvsm.js → 13-BTAtM4vf.js} +2 -2
  102. package/build/server/chunks/{13-NcfCvvsm.js.map → 13-BTAtM4vf.js.map} +1 -1
  103. package/build/server/chunks/{14-DMIFpWXS.js → 14-x6FJT6Iw.js} +2 -2
  104. package/build/server/chunks/{14-DMIFpWXS.js.map → 14-x6FJT6Iw.js.map} +1 -1
  105. package/build/server/chunks/{15-C6n3AtSm.js → 15-DGiz0g4w.js} +4 -4
  106. package/build/server/chunks/{15-C6n3AtSm.js.map → 15-DGiz0g4w.js.map} +1 -1
  107. package/build/server/chunks/{16-QrkvdWP8.js → 16-CuluBZaI.js} +2 -2
  108. package/build/server/chunks/{16-QrkvdWP8.js.map → 16-CuluBZaI.js.map} +1 -1
  109. package/build/server/chunks/{17-DcYHy8LC.js → 17-DZr92is3.js} +2 -2
  110. package/build/server/chunks/{17-DcYHy8LC.js.map → 17-DZr92is3.js.map} +1 -1
  111. package/build/server/chunks/{19-Ba1cLYzj.js → 19-B0hG9_9r.js} +2 -2
  112. package/build/server/chunks/{19-Ba1cLYzj.js.map → 19-B0hG9_9r.js.map} +1 -1
  113. package/build/server/chunks/{2-U9WqYgoH.js → 2-_zknF6gb.js} +2 -2
  114. package/build/server/chunks/{2-U9WqYgoH.js.map → 2-_zknF6gb.js.map} +1 -1
  115. package/build/server/chunks/{20-CXROf0v7.js → 20-Db0y8qIh.js} +2 -2
  116. package/build/server/chunks/{20-CXROf0v7.js.map → 20-Db0y8qIh.js.map} +1 -1
  117. package/build/server/chunks/{21-DOigIeyI.js → 21-CQ2mvrOt.js} +2 -2
  118. package/build/server/chunks/{21-DOigIeyI.js.map → 21-CQ2mvrOt.js.map} +1 -1
  119. package/build/server/chunks/{23-tYS5IPDm.js → 23-CSrUCr2t.js} +2 -2
  120. package/build/server/chunks/{23-tYS5IPDm.js.map → 23-CSrUCr2t.js.map} +1 -1
  121. package/build/server/chunks/{24-C4vhqXEq.js → 24-D14nUSAR.js} +2 -2
  122. package/build/server/chunks/{24-C4vhqXEq.js.map → 24-D14nUSAR.js.map} +1 -1
  123. package/build/server/chunks/{27-DYKzgRQL.js → 27-PXKn2m8M.js} +2 -2
  124. package/build/server/chunks/{27-DYKzgRQL.js.map → 27-PXKn2m8M.js.map} +1 -1
  125. package/build/server/chunks/{28-CXrb03KH.js → 28-DYuI_Cgr.js} +2 -2
  126. package/build/server/chunks/{28-CXrb03KH.js.map → 28-DYuI_Cgr.js.map} +1 -1
  127. package/build/server/chunks/{29-DOzMYo4t.js → 29-CrDIu9-c.js} +2 -2
  128. package/build/server/chunks/{29-DOzMYo4t.js.map → 29-CrDIu9-c.js.map} +1 -1
  129. package/build/server/chunks/{3-Df4VHTHU.js → 3-Dk3O-ses.js} +2 -2
  130. package/build/server/chunks/{3-Df4VHTHU.js.map → 3-Dk3O-ses.js.map} +1 -1
  131. package/build/server/chunks/{30-CIAlEMGw.js → 30-ZXGKLYtR.js} +2 -2
  132. package/build/server/chunks/{30-CIAlEMGw.js.map → 30-ZXGKLYtR.js.map} +1 -1
  133. package/build/server/chunks/{5-CuGUtDxT.js → 5-DZF9fTQJ.js} +2 -2
  134. package/build/server/chunks/{5-CuGUtDxT.js.map → 5-DZF9fTQJ.js.map} +1 -1
  135. package/build/server/chunks/{6-BGQVX0lN.js → 6-Dv8dgI1X.js} +2 -2
  136. package/build/server/chunks/{6-BGQVX0lN.js.map → 6-Dv8dgI1X.js.map} +1 -1
  137. package/build/server/chunks/{7-D-isYlgr.js → 7-Be6Wvhky.js} +2 -2
  138. package/build/server/chunks/{7-D-isYlgr.js.map → 7-Be6Wvhky.js.map} +1 -1
  139. package/build/server/chunks/{8-ZfjJPjCM.js → 8-CPaEsylT.js} +2 -2
  140. package/build/server/chunks/{8-ZfjJPjCM.js.map → 8-CPaEsylT.js.map} +1 -1
  141. package/build/server/chunks/{9-NgrtpCNf.js → 9-DwCoeD2g.js} +3 -3
  142. package/build/server/chunks/{9-NgrtpCNf.js.map → 9-DwCoeD2g.js.map} +1 -1
  143. package/build/server/chunks/{_page.svelte-cjTi5BVx.js → _page.svelte-BCCCalas.js} +5 -5
  144. package/build/server/chunks/_page.svelte-BCCCalas.js.map +1 -0
  145. package/build/server/chunks/{_page.svelte-Bt5WuxST.js → _page.svelte-BptS1zpT.js} +4 -4
  146. package/build/server/chunks/_page.svelte-BptS1zpT.js.map +1 -0
  147. package/build/server/chunks/{_server.ts-4DY4RPVn.js → _server.ts-uQSc7PGB.js} +125 -30
  148. package/build/server/chunks/_server.ts-uQSc7PGB.js.map +1 -0
  149. package/build/server/index.js +1 -1
  150. package/build/server/index.js.map +1 -1
  151. package/build/server/manifest.js +25 -25
  152. package/build/server/manifest.js.map +1 -1
  153. package/package.json +6 -6
  154. package/build/client/_app/immutable/chunks/BXD0khLj.js +0 -3
  155. package/build/client/_app/immutable/chunks/BXD0khLj.js.br +0 -0
  156. package/build/client/_app/immutable/chunks/BXD0khLj.js.gz +0 -0
  157. package/build/client/_app/immutable/chunks/Bil3tPvX.js.br +0 -0
  158. package/build/client/_app/immutable/chunks/Bil3tPvX.js.gz +0 -0
  159. package/build/client/_app/immutable/chunks/CqsZL3G3.js.br +0 -0
  160. package/build/client/_app/immutable/chunks/CqsZL3G3.js.gz +0 -0
  161. package/build/client/_app/immutable/chunks/DHlGhLx2.js.br +0 -0
  162. package/build/client/_app/immutable/chunks/DHlGhLx2.js.gz +0 -0
  163. package/build/client/_app/immutable/chunks/D_att4ap.js.br +0 -0
  164. package/build/client/_app/immutable/chunks/D_att4ap.js.gz +0 -0
  165. package/build/client/_app/immutable/chunks/ljBlCROD.js.br +0 -0
  166. package/build/client/_app/immutable/chunks/ljBlCROD.js.gz +0 -0
  167. package/build/client/_app/immutable/entry/app.mgpIphLA.js.br +0 -0
  168. package/build/client/_app/immutable/entry/app.mgpIphLA.js.gz +0 -0
  169. package/build/client/_app/immutable/entry/start.BeOYgQko.js +0 -1
  170. package/build/client/_app/immutable/entry/start.BeOYgQko.js.br +0 -2
  171. package/build/client/_app/immutable/entry/start.BeOYgQko.js.gz +0 -0
  172. package/build/client/_app/immutable/nodes/1.ER8kCa8u.js.br +0 -0
  173. package/build/client/_app/immutable/nodes/1.ER8kCa8u.js.gz +0 -0
  174. package/build/client/_app/immutable/nodes/11.etqQMTbZ.js.br +0 -0
  175. package/build/client/_app/immutable/nodes/11.etqQMTbZ.js.gz +0 -0
  176. package/build/client/_app/immutable/nodes/13.D2C7ZhRM.js.br +0 -0
  177. package/build/client/_app/immutable/nodes/13.D2C7ZhRM.js.gz +0 -0
  178. package/build/client/_app/immutable/nodes/14.BsMD1FMo.js.br +0 -0
  179. package/build/client/_app/immutable/nodes/14.BsMD1FMo.js.gz +0 -0
  180. package/build/client/_app/immutable/nodes/15.BZg0-72V.js.br +0 -0
  181. package/build/client/_app/immutable/nodes/15.BZg0-72V.js.gz +0 -0
  182. package/build/client/_app/immutable/nodes/16.CNZK2Sd5.js.br +0 -0
  183. package/build/client/_app/immutable/nodes/16.CNZK2Sd5.js.gz +0 -0
  184. package/build/client/_app/immutable/nodes/17.DnbXph3_.js.br +0 -0
  185. package/build/client/_app/immutable/nodes/17.DnbXph3_.js.gz +0 -0
  186. package/build/client/_app/immutable/nodes/19.DUkWoiIb.js.br +0 -0
  187. package/build/client/_app/immutable/nodes/19.DUkWoiIb.js.gz +0 -0
  188. package/build/client/_app/immutable/nodes/2.Cpz-Tpy2.js.br +0 -0
  189. package/build/client/_app/immutable/nodes/2.Cpz-Tpy2.js.gz +0 -0
  190. package/build/client/_app/immutable/nodes/20.DBQniFEt.js.br +0 -0
  191. package/build/client/_app/immutable/nodes/20.DBQniFEt.js.gz +0 -0
  192. package/build/client/_app/immutable/nodes/21.DWPqhlKJ.js.br +0 -0
  193. package/build/client/_app/immutable/nodes/21.DWPqhlKJ.js.gz +0 -0
  194. package/build/client/_app/immutable/nodes/23.CDmYEi90.js.br +0 -0
  195. package/build/client/_app/immutable/nodes/23.CDmYEi90.js.gz +0 -0
  196. package/build/client/_app/immutable/nodes/24.Cry95nKW.js.br +0 -0
  197. package/build/client/_app/immutable/nodes/24.Cry95nKW.js.gz +0 -0
  198. package/build/client/_app/immutable/nodes/27.CDltPd6D.js.br +0 -0
  199. package/build/client/_app/immutable/nodes/27.CDltPd6D.js.gz +0 -0
  200. package/build/client/_app/immutable/nodes/28.HXbeDTJx.js.br +0 -0
  201. package/build/client/_app/immutable/nodes/28.HXbeDTJx.js.gz +0 -0
  202. package/build/client/_app/immutable/nodes/29.B9r1wv_8.js.br +0 -0
  203. package/build/client/_app/immutable/nodes/29.B9r1wv_8.js.gz +0 -0
  204. package/build/client/_app/immutable/nodes/3.D4JVLXS4.js.br +0 -0
  205. package/build/client/_app/immutable/nodes/3.D4JVLXS4.js.gz +0 -0
  206. package/build/client/_app/immutable/nodes/30.Bv8cJH8I.js.br +0 -0
  207. package/build/client/_app/immutable/nodes/30.Bv8cJH8I.js.gz +0 -0
  208. package/build/client/_app/immutable/nodes/5.89J4ek9w.js.br +0 -0
  209. package/build/client/_app/immutable/nodes/5.89J4ek9w.js.gz +0 -0
  210. package/build/client/_app/immutable/nodes/6.DEn0bSbE.js.br +0 -0
  211. package/build/client/_app/immutable/nodes/6.DEn0bSbE.js.gz +0 -0
  212. package/build/client/_app/immutable/nodes/7.D1Yc2D4z.js.br +0 -0
  213. package/build/client/_app/immutable/nodes/7.D1Yc2D4z.js.gz +0 -0
  214. package/build/client/_app/immutable/nodes/8.BAgBqrSM.js.br +0 -0
  215. package/build/client/_app/immutable/nodes/8.BAgBqrSM.js.gz +0 -0
  216. package/build/client/_app/immutable/nodes/9.BUj5Fhuu.js +0 -1
  217. package/build/client/_app/immutable/nodes/9.BUj5Fhuu.js.br +0 -0
  218. package/build/client/_app/immutable/nodes/9.BUj5Fhuu.js.gz +0 -0
  219. package/build/server/chunks/_page.svelte-Bt5WuxST.js.map +0 -1
  220. package/build/server/chunks/_page.svelte-cjTi5BVx.js.map +0 -1
  221. package/build/server/chunks/_server.ts-4DY4RPVn.js.map +0 -1
@@ -32,36 +32,98 @@ function readRuntimeVersion(dir) {
32
32
  function shellQuote(s) {
33
33
  return `'${s.replace(/'/g, `'\\''`)}'`;
34
34
  }
35
- function wrapWithTee(innerCommand, prelude = []) {
35
+ function buildLauncher(runnerScript, prelude = []) {
36
36
  const echoes = prelude.map((line) => `echo ${shellQuote(line)}`).join("\n");
37
37
  return `
38
38
  LOGFILE=${shellQuote(UPDATE_LOG_PATH)}
39
+ RUNNER=/tmp/selva-update-runner.sh
39
40
  mkdir -p "$(dirname "$LOGFILE")"
40
41
  : > "$LOGFILE"
42
+
43
+ cat > "$RUNNER" <<'__SELVA_RUNNER_EOF__'
44
+ ${runnerScript}
45
+ __SELVA_RUNNER_EOF__
46
+ chmod +x "$RUNNER"
47
+
41
48
  trap '' PIPE
42
49
  exec > >(tee --output-error=warn-nopipe -a "$LOGFILE" 2>/dev/null) 2>&1
43
50
  ${echoes}
44
- ${innerCommand}
51
+
52
+ # Daemonize the runner so PM2's tree-kill of selva-compute can't reach it.
53
+ # setsid puts it in a new session; the trailing & + disown + launcher exit
54
+ # leaves the runner with PPID=1 once we're gone. stdin/stdout/stderr are
55
+ # fully detached from this process (and from selva-compute's pipes).
56
+ setsid bash "$RUNNER" </dev/null >>"$LOGFILE" 2>&1 &
57
+ RUNNER_PID=$!
58
+ disown
59
+ echo "[INFO] Update runner started (PID $RUNNER_PID, log: $LOGFILE)"
60
+
61
+ # Small pause so the runner has time to print its first line before SSE
62
+ # closes — otherwise the frontend's first poll might see no progress.
63
+ sleep 1
64
+ exit 0
45
65
  `;
46
66
  }
47
- function buildNpmUpdateScript(npmArgs, versionBefore) {
67
+ function buildNpmRunnerScript(npmArgs, versionBefore, ecosystemPath) {
48
68
  const npmCommand = ["npm", ...npmArgs].map(shellQuote).join(" ");
49
69
  const before = shellQuote(versionBefore ?? "");
50
- return `
70
+ const ecosystem = shellQuote(ecosystemPath);
71
+ return `#!/bin/bash
51
72
  set -o pipefail
52
73
  BEFORE=${before}
74
+ ECOSYSTEM=${ecosystem}
53
75
 
54
- # PM2's in-memory daemon and the installed CLI can drift apart after a
55
- # global pm2 upgrade the daemon keeps running whatever version started it,
56
- # while the CLI on disk moves forward. When they diverge, PM2 prints
57
- # "In-memory PM2 is out-of-date" and process commands talk to a stale
58
- # daemon, manifesting as restarts that stop the old process but never bring
59
- # the new one online. \`pm2 update\` dumps processes, kills the daemon,
60
- # respawns it on the current CLI version, and restores the processes.
61
- # Resync proactively so the stop/start below talks to a coherent daemon.
76
+ # Last-resort safety net. If the script exits with the app NOT online for
77
+ # any reason (crash, kill -9, network blip, npm hang past timeout), try to
78
+ # bring it back from ecosystem.config.cjs before we go. The whole point of
79
+ # this script is to update the app; leaving it down is the worst possible
80
+ # outcome.
81
+ on_exit() {
82
+ STATUS=$(pm2 jlist 2>/dev/null | node -e "
83
+ try {
84
+ const list = JSON.parse(require('fs').readFileSync('/dev/stdin','utf8'));
85
+ const app = list.find(p => p.name === 'selva-compute');
86
+ process.stdout.write(app ? app.pm2_env.status : 'missing');
87
+ } catch { process.stdout.write('error'); }
88
+ " 2>/dev/null || echo "error")
89
+ if [ "$STATUS" != "online" ]; then
90
+ echo "[RECOVER] selva-compute is '$STATUS' — starting from ecosystem.config.cjs"
91
+ pm2 start "$ECOSYSTEM" --update-env >/dev/null 2>&1 || \\
92
+ echo "[RECOVER] pm2 start failed — manual intervention required: cd $(dirname "$ECOSYSTEM") && pm2 start ecosystem.config.cjs"
93
+ fi
94
+ }
95
+ trap on_exit EXIT
96
+
97
+ # ---------------------------------------------------------------------------
98
+ # 1. Pre-flight: skip the whole cycle if there's nothing to install.
99
+ # ---------------------------------------------------------------------------
100
+ # Without this, clicking "Update" on an already-current instance triggered
101
+ # a full stop/install/start cycle and a downtime window for no reason. Now
102
+ # we just check the registry first.
103
+ echo "[STEP] Checking npm registry for available updates"
104
+ LATEST=$(npm view @selvajs/selva version --silent 2>/dev/null || echo "")
105
+ if [ -z "$LATEST" ]; then
106
+ echo "[WARN] Could not query npm registry — proceeding with update attempt anyway"
107
+ elif [ -n "$BEFORE" ] && [ "$LATEST" = "$BEFORE" ]; then
108
+ echo "[INFO] Already on the latest version ($BEFORE)"
109
+ echo "[DONE] Nothing to do"
110
+ exit 0
111
+ else
112
+ echo "[INFO] Available: $BEFORE → $LATEST"
113
+ fi
114
+
115
+ # ---------------------------------------------------------------------------
116
+ # 2. Resync PM2 daemon if its in-memory version drifted from the CLI on disk.
117
+ # ---------------------------------------------------------------------------
118
+ # After a global pm2 upgrade the daemon keeps running its original version
119
+ # while the CLI moves forward. Process commands then talk to a stale daemon
120
+ # and the symptom is "stop works, start never lands". \`pm2 update\` dumps
121
+ # processes, kills the daemon, respawns on the current CLI, restores the
122
+ # dump. Doing it before we touch anything keeps the rest of the script
123
+ # talking to a coherent daemon.
62
124
  echo "[STEP] Checking PM2 daemon/CLI version sync"
63
125
  if pm2 ping 2>&1 | grep -q "out-of-date" || pm2 list 2>&1 | grep -q "out-of-date"; then
64
- echo "[STEP] PM2 daemon is out-of-date — running 'pm2 update' to resync before touching the app"
126
+ echo "[STEP] PM2 daemon is out-of-date — running 'pm2 update' to resync"
65
127
  if ! pm2 update; then
66
128
  echo "[FATAL] pm2 update failed — aborting before stopping the running app"
67
129
  exit 1
@@ -69,22 +131,30 @@ if pm2 ping 2>&1 | grep -q "out-of-date" || pm2 list 2>&1 | grep -q "out-of-date
69
131
  echo "[INFO] PM2 daemon resynced"
70
132
  fi
71
133
 
72
- # IMPORTANT: stop the running process BEFORE npm update overwrites build/.
134
+ # ---------------------------------------------------------------------------
135
+ # 3. Stop selva-compute BEFORE npm rewrites build/.
136
+ # ---------------------------------------------------------------------------
73
137
  # SvelteKit's node adapter lazy-imports chunks from build/server/chunks/ on
74
- # every request. If we let npm rewrite build/ while the old process is still
75
- # serving traffic, in-flight requests hit ERR_MODULE_NOT_FOUND for chunks
138
+ # every request. Letting npm rewrite build/ while the old process is still
139
+ # serving traffic = in-flight requests hit ERR_MODULE_NOT_FOUND for chunks
76
140
  # whose hash just changed under their feet. Stopping first is a brief
77
141
  # downtime window (~1-2s longer than restart-in-place) for a much smaller
78
142
  # blast radius.
79
- echo "[STEP] Stopping selva-compute (graceful drain via kill_timeout in ecosystem.config.cjs)"
143
+ #
144
+ # This is also where the SSE connection to the frontend dies — selva-compute
145
+ # IS the SSE server. From here on, the user sees output via the log-file
146
+ # polling fallback in the admin UI, not over SSE.
147
+ echo "[STEP] Stopping selva-compute"
80
148
  if ! pm2 stop selva-compute; then
81
149
  echo "[WARN] pm2 stop failed — selva-compute may not be running yet. Continuing."
82
150
  fi
83
151
 
152
+ # ---------------------------------------------------------------------------
153
+ # 4. Run npm update.
154
+ # ---------------------------------------------------------------------------
84
155
  echo "[STEP] Updating @selvajs/* packages"
85
156
  if ! ${npmCommand}; then
86
- echo "[FATAL] npm update failed — restarting old build to recover"
87
- pm2 start selva-compute --update-env >/dev/null 2>&1 || true
157
+ echo "[FATAL] npm update failed — EXIT trap will restart the previous build"
88
158
  exit 1
89
159
  fi
90
160
 
@@ -99,17 +169,34 @@ if [ -n "$BEFORE" ] && [ "$BEFORE" = "$AFTER" ]; then
99
169
  echo "[WARN] npm install --prefer-online"
100
170
  fi
101
171
 
172
+ # ---------------------------------------------------------------------------
173
+ # 5. Start selva-compute with the new build.
174
+ # ---------------------------------------------------------------------------
175
+ # Start from ecosystem.config.cjs, NOT \`pm2 start selva-compute\` — the
176
+ # latter requires selva-compute to already be in pm2's in-memory process
177
+ # list. After a \`pm2 update\` (step 2) that's not guaranteed.
102
178
  echo "[STEP] Starting selva-compute with new build"
103
- if ! pm2 start selva-compute --update-env; then
179
+ if ! pm2 start "$ECOSYSTEM" --update-env; then
104
180
  echo "[FATAL] pm2 start failed — investigate with \\\`pm2 logs selva-compute\\\`"
105
181
  exit 2
106
182
  fi
107
183
 
108
- echo "[STEP] Health-probing the new process"
184
+ # ---------------------------------------------------------------------------
185
+ # 6. Health probe the new process.
186
+ # ---------------------------------------------------------------------------
187
+ # Read PORT from .env the same way scripts/update.sh does, so non-default
188
+ # ports are respected.
189
+ PORT=$(grep "^PORT=" .env 2>/dev/null \\
190
+ | head -1 \\
191
+ | cut -d'=' -f2 \\
192
+ | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' -e 's/^["'"'"']//' -e 's/["'"'"']$//' -e 's/[[:space:]]*#.*//')
193
+ PORT=\${PORT:-3000}
194
+
195
+ echo "[STEP] Health-probing the new process on port $PORT"
109
196
  HEALTHY=0
110
197
  for i in $(seq 1 15); do
111
198
  sleep 2
112
- CODE=$(curl -sS -o /tmp/selva-health.$$ -w "%{http_code}" --max-time 5 http://localhost:3000/api/health 2>/dev/null || echo "000")
199
+ CODE=$(curl -sS -o /tmp/selva-health.$$ -w "%{http_code}" --max-time 5 "http://localhost:$PORT/api/health" 2>/dev/null || echo "000")
113
200
  if [ "$CODE" = "200" ]; then
114
201
  HEALTHY=1
115
202
  echo "[INFO] Health probe passed after \${i} attempt(s)"
@@ -124,6 +211,9 @@ if [ "$HEALTHY" = "1" ]; then
124
211
  exit 0
125
212
  fi
126
213
 
214
+ # ---------------------------------------------------------------------------
215
+ # 7. Rollback path.
216
+ # ---------------------------------------------------------------------------
127
217
  echo "[FATAL] New process failed health check after 30s"
128
218
  if [ -f /tmp/selva-health.$$ ]; then
129
219
  echo "[FATAL] Last response body:"
@@ -133,21 +223,20 @@ fi
133
223
 
134
224
  if [ -z "$BEFORE" ]; then
135
225
  echo "[FATAL] No prior version recorded — cannot roll back automatically."
136
- echo "[FATAL] Manually install the version you want: npm install @selvajs/selva@<version>"
226
+ echo "[FATAL] EXIT trap will attempt to restart the current build anyway."
137
227
  exit 3
138
228
  fi
139
229
 
140
230
  echo "[STEP] Rolling back @selvajs/selva to $BEFORE"
141
231
  pm2 stop selva-compute >/dev/null 2>&1 || true
142
232
  if ! npm install --save "@selvajs/selva@$BEFORE"; then
143
- echo "[FATAL] Rollback npm install failed — manual intervention required."
144
- pm2 start selva-compute --update-env >/dev/null 2>&1 || true
233
+ echo "[FATAL] Rollback npm install failed — EXIT trap will retry restart."
145
234
  exit 4
146
235
  fi
147
236
 
148
- pm2 start selva-compute --update-env || true
237
+ pm2 start "$ECOSYSTEM" --update-env || true
149
238
  sleep 3
150
- ROLLBACK_CODE=$(curl -sS -o /dev/null -w "%{http_code}" --max-time 5 http://localhost:3000/api/health 2>/dev/null || echo "000")
239
+ ROLLBACK_CODE=$(curl -sS -o /dev/null -w "%{http_code}" --max-time 5 "http://localhost:$PORT/api/health" 2>/dev/null || echo "000")
151
240
  if [ "$ROLLBACK_CODE" = "200" ]; then
152
241
  echo "[DONE] Rolled back to $BEFORE — previous version is online"
153
242
  exit 5
@@ -217,9 +306,15 @@ const POST = async ({ locals }) => {
217
306
  `[INFO] Update mode: ${plan.mode} (cwd: ${plan.cwd})`,
218
307
  ...versionBefore ? [`[INFO] Current @selvajs/selva: ${versionBefore}`] : []
219
308
  ];
220
- const innerCommand = plan.mode === "git" ? `exec ${shellQuote(plan.cmd)} ${plan.args.map(shellQuote).join(" ")}` : buildNpmUpdateScript(plan.args, versionBefore);
309
+ const runnerScript = plan.mode === "git" ? `#!/bin/bash
310
+ exec ${shellQuote(plan.cmd)} ${plan.args.map(shellQuote).join(" ")}
311
+ ` : buildNpmRunnerScript(
312
+ plan.args,
313
+ versionBefore,
314
+ join(plan.cwd, "ecosystem.config.cjs")
315
+ );
221
316
  const cmd = "bash";
222
- const args = ["-c", wrapWithTee(innerCommand, prelude)];
317
+ const args = ["-c", buildLauncher(runnerScript, prelude)];
223
318
  const localBin = join(plan.cwd, "node_modules", ".bin");
224
319
  const child = spawn(cmd, args, {
225
320
  cwd: plan.cwd,
@@ -310,4 +405,4 @@ const GET = async ({ locals }) => {
310
405
  };
311
406
 
312
407
  export { GET, POST };
313
- //# sourceMappingURL=_server.ts-4DY4RPVn.js.map
408
+ //# sourceMappingURL=_server.ts-uQSc7PGB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_server.ts-uQSc7PGB.js","sources":["../../../.svelte-kit/adapter-node/entries/endpoints/admin/api/system/update/_server.ts.js"],"sourcesContent":["import { spawn } from \"child_process\";\nimport { join } from \"path\";\nimport { readFileSync, existsSync } from \"fs\";\nimport { b as private_env } from \"../../../../../../chunks/shared-server.js\";\nimport { b as requirePermission } from \"../../../../../../chunks/access.server.js\";\nconst UPDATE_LOG_PATH = \"/tmp/selva-update.log\";\nfunction stripAnsi(str) {\n return str.replace(/\\x1B\\[[0-9;]*[mGKHF]/g, \"\");\n}\nfunction readRuntimeVersion(dir) {\n try {\n const pkg = JSON.parse(\n readFileSync(join(dir, \"node_modules\", \"@selvajs\", \"selva\", \"package.json\"), \"utf8\")\n );\n return typeof pkg.version === \"string\" ? pkg.version : void 0;\n } catch {\n return void 0;\n }\n}\nfunction shellQuote(s) {\n return `'${s.replace(/'/g, `'\\\\''`)}'`;\n}\nfunction buildLauncher(runnerScript, prelude = []) {\n const echoes = prelude.map((line) => `echo ${shellQuote(line)}`).join(\"\\n\");\n return `\nLOGFILE=${shellQuote(UPDATE_LOG_PATH)}\nRUNNER=/tmp/selva-update-runner.sh\nmkdir -p \"$(dirname \"$LOGFILE\")\"\n: > \"$LOGFILE\"\n\ncat > \"$RUNNER\" <<'__SELVA_RUNNER_EOF__'\n${runnerScript}\n__SELVA_RUNNER_EOF__\nchmod +x \"$RUNNER\"\n\ntrap '' PIPE\nexec > >(tee --output-error=warn-nopipe -a \"$LOGFILE\" 2>/dev/null) 2>&1\n${echoes}\n\n# Daemonize the runner so PM2's tree-kill of selva-compute can't reach it.\n# setsid puts it in a new session; the trailing & + disown + launcher exit\n# leaves the runner with PPID=1 once we're gone. stdin/stdout/stderr are\n# fully detached from this process (and from selva-compute's pipes).\nsetsid bash \"$RUNNER\" </dev/null >>\"$LOGFILE\" 2>&1 &\nRUNNER_PID=$!\ndisown\necho \"[INFO] Update runner started (PID $RUNNER_PID, log: $LOGFILE)\"\n\n# Small pause so the runner has time to print its first line before SSE\n# closes — otherwise the frontend's first poll might see no progress.\nsleep 1\nexit 0\n`;\n}\nfunction buildNpmRunnerScript(npmArgs, versionBefore, ecosystemPath) {\n const npmCommand = [\"npm\", ...npmArgs].map(shellQuote).join(\" \");\n const before = shellQuote(versionBefore ?? \"\");\n const ecosystem = shellQuote(ecosystemPath);\n return `#!/bin/bash\nset -o pipefail\nBEFORE=${before}\nECOSYSTEM=${ecosystem}\n\n# Last-resort safety net. If the script exits with the app NOT online for\n# any reason (crash, kill -9, network blip, npm hang past timeout), try to\n# bring it back from ecosystem.config.cjs before we go. The whole point of\n# this script is to update the app; leaving it down is the worst possible\n# outcome.\non_exit() {\n STATUS=$(pm2 jlist 2>/dev/null | node -e \"\n try {\n const list = JSON.parse(require('fs').readFileSync('/dev/stdin','utf8'));\n const app = list.find(p => p.name === 'selva-compute');\n process.stdout.write(app ? app.pm2_env.status : 'missing');\n } catch { process.stdout.write('error'); }\n \" 2>/dev/null || echo \"error\")\n if [ \"$STATUS\" != \"online\" ]; then\n echo \"[RECOVER] selva-compute is '$STATUS' — starting from ecosystem.config.cjs\"\n pm2 start \"$ECOSYSTEM\" --update-env >/dev/null 2>&1 || \\\\\n echo \"[RECOVER] pm2 start failed — manual intervention required: cd $(dirname \"$ECOSYSTEM\") && pm2 start ecosystem.config.cjs\"\n fi\n}\ntrap on_exit EXIT\n\n# ---------------------------------------------------------------------------\n# 1. Pre-flight: skip the whole cycle if there's nothing to install.\n# ---------------------------------------------------------------------------\n# Without this, clicking \"Update\" on an already-current instance triggered\n# a full stop/install/start cycle and a downtime window for no reason. Now\n# we just check the registry first.\necho \"[STEP] Checking npm registry for available updates\"\nLATEST=$(npm view @selvajs/selva version --silent 2>/dev/null || echo \"\")\nif [ -z \"$LATEST\" ]; then\n echo \"[WARN] Could not query npm registry — proceeding with update attempt anyway\"\nelif [ -n \"$BEFORE\" ] && [ \"$LATEST\" = \"$BEFORE\" ]; then\n echo \"[INFO] Already on the latest version ($BEFORE)\"\n echo \"[DONE] Nothing to do\"\n exit 0\nelse\n echo \"[INFO] Available: $BEFORE → $LATEST\"\nfi\n\n# ---------------------------------------------------------------------------\n# 2. Resync PM2 daemon if its in-memory version drifted from the CLI on disk.\n# ---------------------------------------------------------------------------\n# After a global pm2 upgrade the daemon keeps running its original version\n# while the CLI moves forward. Process commands then talk to a stale daemon\n# and the symptom is \"stop works, start never lands\". \\`pm2 update\\` dumps\n# processes, kills the daemon, respawns on the current CLI, restores the\n# dump. Doing it before we touch anything keeps the rest of the script\n# talking to a coherent daemon.\necho \"[STEP] Checking PM2 daemon/CLI version sync\"\nif pm2 ping 2>&1 | grep -q \"out-of-date\" || pm2 list 2>&1 | grep -q \"out-of-date\"; then\n echo \"[STEP] PM2 daemon is out-of-date — running 'pm2 update' to resync\"\n if ! pm2 update; then\n echo \"[FATAL] pm2 update failed — aborting before stopping the running app\"\n exit 1\n fi\n echo \"[INFO] PM2 daemon resynced\"\nfi\n\n# ---------------------------------------------------------------------------\n# 3. Stop selva-compute BEFORE npm rewrites build/.\n# ---------------------------------------------------------------------------\n# SvelteKit's node adapter lazy-imports chunks from build/server/chunks/ on\n# every request. Letting npm rewrite build/ while the old process is still\n# serving traffic = in-flight requests hit ERR_MODULE_NOT_FOUND for chunks\n# whose hash just changed under their feet. Stopping first is a brief\n# downtime window (~1-2s longer than restart-in-place) for a much smaller\n# blast radius.\n#\n# This is also where the SSE connection to the frontend dies — selva-compute\n# IS the SSE server. From here on, the user sees output via the log-file\n# polling fallback in the admin UI, not over SSE.\necho \"[STEP] Stopping selva-compute\"\nif ! pm2 stop selva-compute; then\n echo \"[WARN] pm2 stop failed — selva-compute may not be running yet. Continuing.\"\nfi\n\n# ---------------------------------------------------------------------------\n# 4. Run npm update.\n# ---------------------------------------------------------------------------\necho \"[STEP] Updating @selvajs/* packages\"\nif ! ${npmCommand}; then\n echo \"[FATAL] npm update failed — EXIT trap will restart the previous build\"\n exit 1\nfi\n\nAFTER=$(node -e \"try{console.log(require('./node_modules/@selvajs/selva/package.json').version)}catch(e){}\" 2>/dev/null)\necho \"[INFO] New @selvajs/selva: \\${AFTER:-unknown}\"\n\nif [ -n \"$BEFORE\" ] && [ \"$BEFORE\" = \"$AFTER\" ]; then\n echo \"[WARN] No version change ($BEFORE). Your npm cache may be stale.\"\n echo \"[WARN] Recover with:\"\n echo \"[WARN] npm cache clean --force\"\n echo \"[WARN] rm -rf node_modules package-lock.json\"\n echo \"[WARN] npm install --prefer-online\"\nfi\n\n# ---------------------------------------------------------------------------\n# 5. Start selva-compute with the new build.\n# ---------------------------------------------------------------------------\n# Start from ecosystem.config.cjs, NOT \\`pm2 start selva-compute\\` — the\n# latter requires selva-compute to already be in pm2's in-memory process\n# list. After a \\`pm2 update\\` (step 2) that's not guaranteed.\necho \"[STEP] Starting selva-compute with new build\"\nif ! pm2 start \"$ECOSYSTEM\" --update-env; then\n echo \"[FATAL] pm2 start failed — investigate with \\\\\\`pm2 logs selva-compute\\\\\\`\"\n exit 2\nfi\n\n# ---------------------------------------------------------------------------\n# 6. Health probe the new process.\n# ---------------------------------------------------------------------------\n# Read PORT from .env the same way scripts/update.sh does, so non-default\n# ports are respected.\nPORT=$(grep \"^PORT=\" .env 2>/dev/null \\\\\n | head -1 \\\\\n | cut -d'=' -f2 \\\\\n | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' -e 's/^[\"'\"'\"']//' -e 's/[\"'\"'\"']$//' -e 's/[[:space:]]*#.*//')\nPORT=\\${PORT:-3000}\n\necho \"[STEP] Health-probing the new process on port $PORT\"\nHEALTHY=0\nfor i in $(seq 1 15); do\n sleep 2\n CODE=$(curl -sS -o /tmp/selva-health.$$ -w \"%{http_code}\" --max-time 5 \"http://localhost:$PORT/api/health\" 2>/dev/null || echo \"000\")\n if [ \"$CODE\" = \"200\" ]; then\n HEALTHY=1\n echo \"[INFO] Health probe passed after \\${i} attempt(s)\"\n rm -f /tmp/selva-health.$$\n break\n fi\n echo \"[INFO] Probe attempt $i/15: HTTP $CODE — retrying\"\ndone\n\nif [ \"$HEALTHY\" = \"1\" ]; then\n echo \"[DONE] Update complete\"\n exit 0\nfi\n\n# ---------------------------------------------------------------------------\n# 7. Rollback path.\n# ---------------------------------------------------------------------------\necho \"[FATAL] New process failed health check after 30s\"\nif [ -f /tmp/selva-health.$$ ]; then\n echo \"[FATAL] Last response body:\"\n cat /tmp/selva-health.$$\n rm -f /tmp/selva-health.$$\nfi\n\nif [ -z \"$BEFORE\" ]; then\n echo \"[FATAL] No prior version recorded — cannot roll back automatically.\"\n echo \"[FATAL] EXIT trap will attempt to restart the current build anyway.\"\n exit 3\nfi\n\necho \"[STEP] Rolling back @selvajs/selva to $BEFORE\"\npm2 stop selva-compute >/dev/null 2>&1 || true\nif ! npm install --save \"@selvajs/selva@$BEFORE\"; then\n echo \"[FATAL] Rollback npm install failed — EXIT trap will retry restart.\"\n exit 4\nfi\n\npm2 start \"$ECOSYSTEM\" --update-env || true\nsleep 3\nROLLBACK_CODE=$(curl -sS -o /dev/null -w \"%{http_code}\" --max-time 5 \"http://localhost:$PORT/api/health\" 2>/dev/null || echo \"000\")\nif [ \"$ROLLBACK_CODE\" = \"200\" ]; then\n echo \"[DONE] Rolled back to $BEFORE — previous version is online\"\n exit 5\nfi\n\necho \"[FATAL] Rollback restart also failed health check (HTTP $ROLLBACK_CODE)\"\necho \"[FATAL] Manual recovery required. Check: pm2 logs selva-compute\"\nexit 6\n`;\n}\nfunction detectUpdatePlan() {\n if (private_env.INSTALL_DIR && existsSync(join(private_env.INSTALL_DIR, \"scripts\", \"update.sh\"))) {\n return {\n mode: \"git\",\n cwd: private_env.INSTALL_DIR,\n cmd: \"bash\",\n args: [join(private_env.INSTALL_DIR, \"scripts\", \"update.sh\")]\n };\n }\n let dir = process.cwd();\n for (let i = 0; i < 6; i++) {\n if (existsSync(join(dir, \"scripts\", \"update.sh\"))) {\n return {\n mode: \"git\",\n cwd: dir,\n cmd: \"bash\",\n args: [join(dir, \"scripts\", \"update.sh\")]\n };\n }\n if (existsSync(join(dir, \"node_modules\", \"@selvajs\", \"selva\", \"package.json\"))) {\n return {\n mode: \"npm\",\n cwd: dir,\n cmd: \"npm\",\n args: [\"update\", \"--save\", \"--prefer-online\", \"@selvajs/cli\", \"@selvajs/selva\"]\n };\n }\n const parent = join(dir, \"..\");\n if (parent === dir) break;\n dir = parent;\n }\n return null;\n}\nconst POST = async ({ locals }) => {\n requirePermission(locals, \"instance_admin\");\n const plan = detectUpdatePlan();\n if (!plan) {\n return new Response(\n JSON.stringify({\n error: \"Couldn't determine how to update this deployment. Expected either scripts/update.sh (monorepo) or node_modules/@selvajs/selva (CLI scaffold) in the cwd or a parent.\"\n }),\n { status: 500, headers: { \"Content-Type\": \"application/json\" } }\n );\n }\n const stream = new ReadableStream({\n start(controller) {\n const encoder = new TextEncoder();\n function sendEvent(type, data) {\n const message = `data: ${JSON.stringify({ type, ...data })}\n\n`;\n controller.enqueue(encoder.encode(message));\n }\n try {\n const versionBefore = plan.mode === \"npm\" ? readRuntimeVersion(plan.cwd) : void 0;\n const prelude = [\n `[INFO] Update mode: ${plan.mode} (cwd: ${plan.cwd})`,\n ...versionBefore ? [`[INFO] Current @selvajs/selva: ${versionBefore}`] : []\n ];\n const runnerScript = plan.mode === \"git\" ? `#!/bin/bash\nexec ${shellQuote(plan.cmd)} ${plan.args.map(shellQuote).join(\" \")}\n` : buildNpmRunnerScript(\n plan.args,\n versionBefore,\n join(plan.cwd, \"ecosystem.config.cjs\")\n );\n const cmd = \"bash\";\n const args = [\"-c\", buildLauncher(runnerScript, prelude)];\n const localBin = join(plan.cwd, \"node_modules\", \".bin\");\n const child = spawn(cmd, args, {\n cwd: plan.cwd,\n env: {\n PATH: `${localBin}:${process.env.PATH ?? \"\"}`,\n HOME: process.env.HOME,\n INSTALL_DIR: plan.cwd\n },\n detached: true,\n stdio: [\"ignore\", \"pipe\", \"pipe\"]\n });\n child.unref();\n const timeout = setTimeout(\n () => {\n try {\n if (child.pid) process.kill(-child.pid, \"SIGTERM\");\n } catch {\n }\n sendEvent(\"log\", { data: \"[FATAL] Update timed out after 15 minutes\" });\n sendEvent(\"exit\", { code: -1 });\n controller.close();\n },\n 15 * 60 * 1e3\n );\n let restarting = false;\n child.stdout.on(\"data\", (data) => {\n const lines = data.toString().split(\"\\n\");\n for (const line of lines) {\n const clean = stripAnsi(line).trim();\n if (clean) {\n if (!restarting && (clean.includes(\"Applying action stopProcessId\") || clean.includes(\"Applying action restartProcessId\"))) {\n restarting = true;\n sendEvent(\"restarting\", { data: clean });\n } else {\n sendEvent(\"log\", { data: clean });\n }\n }\n }\n });\n child.stderr.on(\"data\", (data) => {\n const lines = data.toString().split(\"\\n\");\n for (const line of lines) {\n const clean = stripAnsi(line).trim();\n if (clean) {\n sendEvent(\"log\", { data: `[ERROR] ${clean}` });\n }\n }\n });\n child.on(\"close\", (code) => {\n clearTimeout(timeout);\n sendEvent(\"exit\", { code: code ?? -1 });\n controller.close();\n });\n child.on(\"error\", (err) => {\n clearTimeout(timeout);\n sendEvent(\"log\", { data: `[FATAL] ${err.message}` });\n sendEvent(\"exit\", { code: -1 });\n controller.close();\n });\n } catch (err) {\n sendEvent(\"log\", { data: `[FATAL] Failed to spawn process: ${err}` });\n sendEvent(\"exit\", { code: -1 });\n controller.close();\n }\n }\n });\n return new Response(stream, {\n headers: {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\"\n }\n });\n};\nconst GET = async ({ locals }) => {\n requirePermission(locals, \"instance_admin\");\n let body = \"\";\n try {\n body = readFileSync(UPDATE_LOG_PATH, \"utf8\");\n } catch {\n }\n return new Response(body, {\n headers: {\n \"Content-Type\": \"text/plain; charset=utf-8\",\n \"Cache-Control\": \"no-store\"\n }\n });\n};\nexport {\n GET,\n POST\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAKA,MAAM,eAAe,GAAG,uBAAuB;AAC/C,SAAS,SAAS,CAAC,GAAG,EAAE;AACxB,EAAE,OAAO,GAAG,CAAC,OAAO,CAAC,uBAAuB,EAAE,EAAE,CAAC;AACjD;AACA,SAAS,kBAAkB,CAAC,GAAG,EAAE;AACjC,EAAE,IAAI;AACN,IAAI,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK;AAC1B,MAAM,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,CAAC,EAAE,MAAM;AACzF,KAAK;AACL,IAAI,OAAO,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,GAAG,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC;AACjE,EAAE,CAAC,CAAC,MAAM;AACV,IAAI,OAAO,MAAM;AACjB,EAAE;AACF;AACA,SAAS,UAAU,CAAC,CAAC,EAAE;AACvB,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACxC;AACA,SAAS,aAAa,CAAC,YAAY,EAAE,OAAO,GAAG,EAAE,EAAE;AACnD,EAAE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;AAC7E,EAAE,OAAO;AACT,QAAQ,EAAE,UAAU,CAAC,eAAe,CAAC;AACrC;AACA;AACA;;AAEA;AACA,EAAE,YAAY;AACd;AACA;;AAEA;AACA;AACA,EAAE,MAAM;;AAER;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA,SAAS,oBAAoB,CAAC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE;AACrE,EAAE,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AAClE,EAAE,MAAM,MAAM,GAAG,UAAU,CAAC,aAAa,IAAI,EAAE,CAAC;AAChD,EAAE,MAAM,SAAS,GAAG,UAAU,CAAC,aAAa,CAAC;AAC7C,EAAE,OAAO,CAAC;AACV;AACA,OAAO,EAAE,MAAM;AACf,UAAU,EAAE,SAAS;;AAErB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK,EAAE,UAAU,CAAC;AAClB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,CAAC;AACD;AACA,SAAS,gBAAgB,GAAG;AAC5B,EAAE,IAAI,WAAW,CAAC,WAAW,IAAI,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,EAAE;AACpG,IAAI,OAAO;AACX,MAAM,IAAI,EAAE,KAAK;AACjB,MAAM,GAAG,EAAE,WAAW,CAAC,WAAW;AAClC,MAAM,GAAG,EAAE,MAAM;AACjB,MAAM,IAAI,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,SAAS,EAAE,WAAW,CAAC;AAClE,KAAK;AACL,EAAE;AACF,EAAE,IAAI,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;AACzB,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;AAC9B,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,EAAE;AACvD,MAAM,OAAO;AACb,QAAQ,IAAI,EAAE,KAAK;AACnB,QAAQ,GAAG,EAAE,GAAG;AAChB,QAAQ,GAAG,EAAE,MAAM;AACnB,QAAQ,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,WAAW,CAAC;AAChD,OAAO;AACP,IAAI;AACJ,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,EAAE;AACpF,MAAM,OAAO;AACb,QAAQ,IAAI,EAAE,KAAK;AACnB,QAAQ,GAAG,EAAE,GAAG;AAChB,QAAQ,GAAG,EAAE,KAAK;AAClB,QAAQ,IAAI,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,iBAAiB,EAAE,cAAc,EAAE,gBAAgB;AACtF,OAAO;AACP,IAAI;AACJ,IAAI,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC;AAClC,IAAI,IAAI,MAAM,KAAK,GAAG,EAAE;AACxB,IAAI,GAAG,GAAG,MAAM;AAChB,EAAE;AACF,EAAE,OAAO,IAAI;AACb;AACK,MAAC,IAAI,GAAG,OAAO,EAAE,MAAM,EAAE,KAAK;AACnC,EAAE,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,CAAC;AAC7C,EAAE,MAAM,IAAI,GAAG,gBAAgB,EAAE;AACjC,EAAE,IAAI,CAAC,IAAI,EAAE;AACb,IAAI,OAAO,IAAI,QAAQ;AACvB,MAAM,IAAI,CAAC,SAAS,CAAC;AACrB,QAAQ,KAAK,EAAE;AACf,OAAO,CAAC;AACR,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;AACpE,KAAK;AACL,EAAE;AACF,EAAE,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC;AACpC,IAAI,KAAK,CAAC,UAAU,EAAE;AACtB,MAAM,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE;AACvC,MAAM,SAAS,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE;AACrC,QAAQ,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC;;AAElE,CAAC;AACD,QAAQ,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACnD,MAAM;AACN,MAAM,IAAI;AACV,QAAQ,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,KAAK,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AACzF,QAAQ,MAAM,OAAO,GAAG;AACxB,UAAU,CAAC,oBAAoB,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,UAAU,GAAG,aAAa,GAAG,CAAC,CAAC,+BAA+B,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG;AACnF,SAAS;AACT,QAAQ,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,KAAK,KAAK,GAAG,CAAC;AACpD,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AAClE,CAAC,GAAG,oBAAoB;AACxB,UAAU,IAAI,CAAC,IAAI;AACnB,UAAU,aAAa;AACvB,UAAU,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,sBAAsB;AAC/C,SAAS;AACT,QAAQ,MAAM,GAAG,GAAG,MAAM;AAC1B,QAAQ,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,aAAa,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;AACjE,QAAQ,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,CAAC;AAC/D,QAAQ,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE;AACvC,UAAU,GAAG,EAAE,IAAI,CAAC,GAAG;AACvB,UAAU,GAAG,EAAE;AACf,YAAY,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;AACzD,YAAY,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI;AAClC,YAAY,WAAW,EAAE,IAAI,CAAC;AAC9B,WAAW;AACX,UAAU,QAAQ,EAAE,IAAI;AACxB,UAAU,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM;AAC1C,SAAS,CAAC;AACV,QAAQ,KAAK,CAAC,KAAK,EAAE;AACrB,QAAQ,MAAM,OAAO,GAAG,UAAU;AAClC,UAAU,MAAM;AAChB,YAAY,IAAI;AAChB,cAAc,IAAI,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,CAAC;AAChE,YAAY,CAAC,CAAC,MAAM;AACpB,YAAY;AACZ,YAAY,SAAS,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,2CAA2C,EAAE,CAAC;AACnF,YAAY,SAAS,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;AAC3C,YAAY,UAAU,CAAC,KAAK,EAAE;AAC9B,UAAU,CAAC;AACX,UAAU,EAAE,GAAG,EAAE,GAAG;AACpB,SAAS;AACT,QAAQ,IAAI,UAAU,GAAG,KAAK;AAC9B,QAAQ,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,KAAK;AAC1C,UAAU,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;AACnD,UAAU,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACpC,YAAY,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;AAChD,YAAY,IAAI,KAAK,EAAE;AACvB,cAAc,IAAI,CAAC,UAAU,KAAK,KAAK,CAAC,QAAQ,CAAC,+BAA+B,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,kCAAkC,CAAC,CAAC,EAAE;AAC1I,gBAAgB,UAAU,GAAG,IAAI;AACjC,gBAAgB,SAAS,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACxD,cAAc,CAAC,MAAM;AACrB,gBAAgB,SAAS,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACjD,cAAc;AACd,YAAY;AACZ,UAAU;AACV,QAAQ,CAAC,CAAC;AACV,QAAQ,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,KAAK;AAC1C,UAAU,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;AACnD,UAAU,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACpC,YAAY,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;AAChD,YAAY,IAAI,KAAK,EAAE;AACvB,cAAc,SAAS,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;AAC5D,YAAY;AACZ,UAAU;AACV,QAAQ,CAAC,CAAC;AACV,QAAQ,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,KAAK;AACpC,UAAU,YAAY,CAAC,OAAO,CAAC;AAC/B,UAAU,SAAS,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC;AACjD,UAAU,UAAU,CAAC,KAAK,EAAE;AAC5B,QAAQ,CAAC,CAAC;AACV,QAAQ,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,KAAK;AACnC,UAAU,YAAY,CAAC,OAAO,CAAC;AAC/B,UAAU,SAAS,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;AAC9D,UAAU,SAAS,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;AACzC,UAAU,UAAU,CAAC,KAAK,EAAE;AAC5B,QAAQ,CAAC,CAAC;AACV,MAAM,CAAC,CAAC,OAAO,GAAG,EAAE;AACpB,QAAQ,SAAS,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,iCAAiC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;AAC7E,QAAQ,SAAS,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AACvC,QAAQ,UAAU,CAAC,KAAK,EAAE;AAC1B,MAAM;AACN,IAAI;AACJ,GAAG,CAAC;AACJ,EAAE,OAAO,IAAI,QAAQ,CAAC,MAAM,EAAE;AAC9B,IAAI,OAAO,EAAE;AACb,MAAM,cAAc,EAAE,mBAAmB;AACzC,MAAM,eAAe,EAAE,UAAU;AACjC,MAAM,UAAU,EAAE;AAClB;AACA,GAAG,CAAC;AACJ;AACK,MAAC,GAAG,GAAG,OAAO,EAAE,MAAM,EAAE,KAAK;AAClC,EAAE,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,CAAC;AAC7C,EAAE,IAAI,IAAI,GAAG,EAAE;AACf,EAAE,IAAI;AACN,IAAI,IAAI,GAAG,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC;AAChD,EAAE,CAAC,CAAC,MAAM;AACV,EAAE;AACF,EAAE,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;AAC5B,IAAI,OAAO,EAAE;AACb,MAAM,cAAc,EAAE,2BAA2B;AACjD,MAAM,eAAe,EAAE;AACvB;AACA,GAAG,CAAC;AACJ;;;;"}
@@ -1175,7 +1175,7 @@ const options = {
1175
1175
  <div class="error">
1176
1176
  <span class="status">` + status + '</span>\n <div class="message">\n <h1>' + message + "</h1>\n </div>\n </div>\n </body>\n</html>\n"
1177
1177
  },
1178
- version_hash: "10eijb"
1178
+ version_hash: "1m65fdr"
1179
1179
  };
1180
1180
  async function get_hooks() {
1181
1181
  let handle;