@smthrs/platform-node 0.0.0-stage → 1.0.0-rc.4

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 (442) hide show
  1. package/CHANGELOG.md +211 -0
  2. package/LICENSE +21 -0
  3. package/README.md +165 -2
  4. package/bin/darwin-arm64/smithers-jj-export +0 -0
  5. package/bin/darwin-x64/smithers-jj-export +0 -0
  6. package/bin/linux-arm64/smithers-jj-export +0 -0
  7. package/bin/linux-x64/smithers-jj-export +4 -0
  8. package/bin/win32-x64/smithers-jj-export.exe +0 -0
  9. package/dist/cjs/AtomicFileSystem.d.ts +147 -0
  10. package/dist/cjs/AtomicFileSystem.d.ts.map +1 -0
  11. package/dist/cjs/AtomicFileSystem.js +234 -0
  12. package/dist/cjs/AtomicFileSystem.js.map +7 -0
  13. package/dist/cjs/EgressHttpClient.d.ts +106 -0
  14. package/dist/cjs/EgressHttpClient.d.ts.map +1 -0
  15. package/dist/cjs/EgressHttpClient.js +202 -0
  16. package/dist/cjs/EgressHttpClient.js.map +7 -0
  17. package/dist/cjs/HostLiveness.d.ts +81 -0
  18. package/dist/cjs/HostLiveness.d.ts.map +1 -0
  19. package/dist/cjs/HostLiveness.js +49 -0
  20. package/dist/cjs/HostLiveness.js.map +7 -0
  21. package/dist/cjs/NodeHost.d.ts +145 -0
  22. package/dist/cjs/NodeHost.d.ts.map +1 -0
  23. package/dist/cjs/NodeHost.js +128 -0
  24. package/dist/cjs/NodeHost.js.map +7 -0
  25. package/dist/cjs/ProcessConfinement.d.ts +61 -0
  26. package/dist/cjs/ProcessConfinement.d.ts.map +1 -0
  27. package/dist/cjs/ProcessConfinement.js +292 -0
  28. package/dist/cjs/ProcessConfinement.js.map +7 -0
  29. package/dist/cjs/ProcessReaper.d.ts +457 -0
  30. package/dist/cjs/ProcessReaper.d.ts.map +1 -0
  31. package/dist/cjs/ProcessReaper.js +349 -0
  32. package/dist/cjs/ProcessReaper.js.map +7 -0
  33. package/dist/cjs/ProcessSandbox.d.ts +391 -0
  34. package/dist/cjs/ProcessSandbox.d.ts.map +1 -0
  35. package/dist/cjs/ProcessSandbox.js +774 -0
  36. package/dist/cjs/ProcessSandbox.js.map +7 -0
  37. package/dist/cjs/ScopedProcess.d.ts +66 -0
  38. package/dist/cjs/ScopedProcess.d.ts.map +1 -0
  39. package/dist/cjs/ScopedProcess.js +87 -0
  40. package/dist/cjs/ScopedProcess.js.map +7 -0
  41. package/dist/cjs/index.d.ts +38 -0
  42. package/dist/cjs/index.d.ts.map +1 -0
  43. package/dist/cjs/index.js +47 -0
  44. package/dist/cjs/index.js.map +7 -0
  45. package/dist/cjs/internal/AtomicFileSystemExecutable.d.ts +61 -0
  46. package/dist/cjs/internal/AtomicFileSystemExecutable.d.ts.map +1 -0
  47. package/dist/cjs/internal/AtomicFileSystemExecutable.js +250 -0
  48. package/dist/cjs/internal/AtomicFileSystemExecutable.js.map +7 -0
  49. package/dist/cjs/internal/AtomicFileSystemProtocol.d.ts +78 -0
  50. package/dist/cjs/internal/AtomicFileSystemProtocol.d.ts.map +1 -0
  51. package/dist/cjs/internal/AtomicFileSystemProtocol.js +382 -0
  52. package/dist/cjs/internal/AtomicFileSystemProtocol.js.map +7 -0
  53. package/dist/cjs/internal/AtomicFileSystemTransport.d.ts +44 -0
  54. package/dist/cjs/internal/AtomicFileSystemTransport.d.ts.map +1 -0
  55. package/dist/cjs/internal/AtomicFileSystemTransport.js +197 -0
  56. package/dist/cjs/internal/AtomicFileSystemTransport.js.map +7 -0
  57. package/dist/cjs/internal/AtomicHelperError.d.ts +35 -0
  58. package/dist/cjs/internal/AtomicHelperError.d.ts.map +1 -0
  59. package/dist/cjs/internal/AtomicHelperError.js +45 -0
  60. package/dist/cjs/internal/AtomicHelperError.js.map +7 -0
  61. package/dist/cjs/internal/AtomicHelperFault.d.ts +59 -0
  62. package/dist/cjs/internal/AtomicHelperFault.d.ts.map +1 -0
  63. package/dist/cjs/internal/AtomicHelperFault.js +66 -0
  64. package/dist/cjs/internal/AtomicHelperFault.js.map +7 -0
  65. package/dist/cjs/internal/PipedProcess.d.ts +35 -0
  66. package/dist/cjs/internal/PipedProcess.d.ts.map +1 -0
  67. package/dist/cjs/internal/PipedProcess.js +309 -0
  68. package/dist/cjs/internal/PipedProcess.js.map +7 -0
  69. package/dist/cjs/internal/ProcSnapshot.d.ts +85 -0
  70. package/dist/cjs/internal/ProcSnapshot.d.ts.map +1 -0
  71. package/dist/cjs/internal/ProcSnapshot.js +123 -0
  72. package/dist/cjs/internal/ProcSnapshot.js.map +7 -0
  73. package/dist/cjs/internal/ProcessCleanup.d.ts +64 -0
  74. package/dist/cjs/internal/ProcessCleanup.d.ts.map +1 -0
  75. package/dist/cjs/internal/ProcessCleanup.js +62 -0
  76. package/dist/cjs/internal/ProcessCleanup.js.map +7 -0
  77. package/dist/cjs/internal/ProcessCleanupPolicyError.d.ts +30 -0
  78. package/dist/cjs/internal/ProcessCleanupPolicyError.d.ts.map +1 -0
  79. package/dist/cjs/internal/ProcessCleanupPolicyError.js +33 -0
  80. package/dist/cjs/internal/ProcessCleanupPolicyError.js.map +7 -0
  81. package/dist/cjs/internal/ProcessFault.d.ts +63 -0
  82. package/dist/cjs/internal/ProcessFault.d.ts.map +1 -0
  83. package/dist/cjs/internal/ProcessFault.js +63 -0
  84. package/dist/cjs/internal/ProcessFault.js.map +7 -0
  85. package/dist/cjs/internal/ProcessSupervisor.d.ts +143 -0
  86. package/dist/cjs/internal/ProcessSupervisor.d.ts.map +1 -0
  87. package/dist/cjs/internal/ProcessSupervisor.js +685 -0
  88. package/dist/cjs/internal/ProcessSupervisor.js.map +7 -0
  89. package/dist/cjs/internal/SupervisorProgram.d.ts +9 -0
  90. package/dist/cjs/internal/SupervisorProgram.d.ts.map +1 -0
  91. package/dist/cjs/internal/SupervisorProgram.js +326 -0
  92. package/dist/cjs/internal/SupervisorProgram.js.map +7 -0
  93. package/dist/cjs/internal/WindowsProcessJob.d.ts +39 -0
  94. package/dist/cjs/internal/WindowsProcessJob.d.ts.map +1 -0
  95. package/dist/cjs/internal/WindowsProcessJob.js +113 -0
  96. package/dist/cjs/internal/WindowsProcessJob.js.map +7 -0
  97. package/dist/cjs/package.json +1 -0
  98. package/dist/esm/AtomicFileSystem.d.ts +147 -0
  99. package/dist/esm/AtomicFileSystem.d.ts.map +1 -0
  100. package/dist/esm/AtomicFileSystem.js +290 -0
  101. package/dist/esm/AtomicFileSystem.js.map +1 -0
  102. package/dist/esm/EgressHttpClient.d.ts +106 -0
  103. package/dist/esm/EgressHttpClient.d.ts.map +1 -0
  104. package/dist/esm/EgressHttpClient.js +259 -0
  105. package/dist/esm/EgressHttpClient.js.map +1 -0
  106. package/dist/esm/HostLiveness.d.ts +81 -0
  107. package/dist/esm/HostLiveness.d.ts.map +1 -0
  108. package/dist/esm/HostLiveness.js +68 -0
  109. package/dist/esm/HostLiveness.js.map +1 -0
  110. package/dist/esm/NodeHost.d.ts +145 -0
  111. package/dist/esm/NodeHost.d.ts.map +1 -0
  112. package/dist/esm/NodeHost.js +162 -0
  113. package/dist/esm/NodeHost.js.map +1 -0
  114. package/dist/esm/ProcessConfinement.d.ts +61 -0
  115. package/dist/esm/ProcessConfinement.d.ts.map +1 -0
  116. package/dist/esm/ProcessConfinement.js +311 -0
  117. package/dist/esm/ProcessConfinement.js.map +1 -0
  118. package/dist/esm/ProcessReaper.d.ts +457 -0
  119. package/dist/esm/ProcessReaper.d.ts.map +1 -0
  120. package/dist/esm/ProcessReaper.js +711 -0
  121. package/dist/esm/ProcessReaper.js.map +1 -0
  122. package/dist/esm/ProcessSandbox.d.ts +391 -0
  123. package/dist/esm/ProcessSandbox.d.ts.map +1 -0
  124. package/dist/esm/ProcessSandbox.js +1043 -0
  125. package/dist/esm/ProcessSandbox.js.map +1 -0
  126. package/dist/esm/ScopedProcess.d.ts +66 -0
  127. package/dist/esm/ScopedProcess.d.ts.map +1 -0
  128. package/dist/esm/ScopedProcess.js +67 -0
  129. package/dist/esm/ScopedProcess.js.map +1 -0
  130. package/dist/esm/index.d.ts +38 -0
  131. package/dist/esm/index.d.ts.map +1 -0
  132. package/dist/esm/index.js +38 -0
  133. package/dist/esm/index.js.map +1 -0
  134. package/dist/esm/internal/AtomicFileSystemExecutable.d.ts +61 -0
  135. package/dist/esm/internal/AtomicFileSystemExecutable.d.ts.map +1 -0
  136. package/dist/esm/internal/AtomicFileSystemExecutable.js +350 -0
  137. package/dist/esm/internal/AtomicFileSystemExecutable.js.map +1 -0
  138. package/dist/esm/internal/AtomicFileSystemProtocol.d.ts +78 -0
  139. package/dist/esm/internal/AtomicFileSystemProtocol.d.ts.map +1 -0
  140. package/dist/esm/internal/AtomicFileSystemProtocol.js +412 -0
  141. package/dist/esm/internal/AtomicFileSystemProtocol.js.map +1 -0
  142. package/dist/esm/internal/AtomicFileSystemTransport.d.ts +44 -0
  143. package/dist/esm/internal/AtomicFileSystemTransport.d.ts.map +1 -0
  144. package/dist/esm/internal/AtomicFileSystemTransport.js +242 -0
  145. package/dist/esm/internal/AtomicFileSystemTransport.js.map +1 -0
  146. package/dist/esm/internal/AtomicHelperError.d.ts +35 -0
  147. package/dist/esm/internal/AtomicHelperError.d.ts.map +1 -0
  148. package/dist/esm/internal/AtomicHelperError.js +39 -0
  149. package/dist/esm/internal/AtomicHelperError.js.map +1 -0
  150. package/dist/esm/internal/AtomicHelperFault.d.ts +59 -0
  151. package/dist/esm/internal/AtomicHelperFault.d.ts.map +1 -0
  152. package/dist/esm/internal/AtomicHelperFault.js +66 -0
  153. package/dist/esm/internal/AtomicHelperFault.js.map +1 -0
  154. package/dist/esm/internal/PipedProcess.d.ts +35 -0
  155. package/dist/esm/internal/PipedProcess.d.ts.map +1 -0
  156. package/dist/esm/internal/PipedProcess.js +321 -0
  157. package/dist/esm/internal/PipedProcess.js.map +1 -0
  158. package/dist/esm/internal/ProcSnapshot.d.ts +85 -0
  159. package/dist/esm/internal/ProcSnapshot.d.ts.map +1 -0
  160. package/dist/esm/internal/ProcSnapshot.js +188 -0
  161. package/dist/esm/internal/ProcSnapshot.js.map +1 -0
  162. package/dist/esm/internal/ProcessCleanup.d.ts +64 -0
  163. package/dist/esm/internal/ProcessCleanup.d.ts.map +1 -0
  164. package/dist/esm/internal/ProcessCleanup.js +45 -0
  165. package/dist/esm/internal/ProcessCleanup.js.map +1 -0
  166. package/dist/esm/internal/ProcessCleanupPolicyError.d.ts +30 -0
  167. package/dist/esm/internal/ProcessCleanupPolicyError.d.ts.map +1 -0
  168. package/dist/esm/internal/ProcessCleanupPolicyError.js +25 -0
  169. package/dist/esm/internal/ProcessCleanupPolicyError.js.map +1 -0
  170. package/dist/esm/internal/ProcessFault.d.ts +63 -0
  171. package/dist/esm/internal/ProcessFault.d.ts.map +1 -0
  172. package/dist/esm/internal/ProcessFault.js +64 -0
  173. package/dist/esm/internal/ProcessFault.js.map +1 -0
  174. package/dist/esm/internal/ProcessSupervisor.d.ts +143 -0
  175. package/dist/esm/internal/ProcessSupervisor.d.ts.map +1 -0
  176. package/dist/esm/internal/ProcessSupervisor.js +689 -0
  177. package/dist/esm/internal/ProcessSupervisor.js.map +1 -0
  178. package/dist/esm/internal/SupervisorProgram.d.ts +9 -0
  179. package/dist/esm/internal/SupervisorProgram.d.ts.map +1 -0
  180. package/dist/esm/internal/SupervisorProgram.js +310 -0
  181. package/dist/esm/internal/SupervisorProgram.js.map +1 -0
  182. package/dist/esm/internal/WindowsProcessJob.d.ts +39 -0
  183. package/dist/esm/internal/WindowsProcessJob.d.ts.map +1 -0
  184. package/dist/esm/internal/WindowsProcessJob.js +115 -0
  185. package/dist/esm/internal/WindowsProcessJob.js.map +1 -0
  186. package/dist/vendor/adapters.json +1757 -0
  187. package/dist/vendor/chunk-2Y7WC4KU.js +109 -0
  188. package/dist/vendor/chunk-3GR5VZ2M.js +118 -0
  189. package/dist/vendor/chunk-42QKY6T6.js +40 -0
  190. package/dist/vendor/chunk-54RLBMTZ.js +61 -0
  191. package/dist/vendor/chunk-5ZMHBXIK.js +55 -0
  192. package/dist/vendor/chunk-6ME2W7TF.js +28 -0
  193. package/dist/vendor/chunk-AMQKOQNT.js +34 -0
  194. package/dist/vendor/chunk-B3FZ67QU.js +59 -0
  195. package/dist/vendor/chunk-BKTBUBQY.js +437 -0
  196. package/dist/vendor/chunk-DS7GF46S.js +34 -0
  197. package/dist/vendor/chunk-DVOAHXPG.js +104 -0
  198. package/dist/vendor/chunk-DWSHTSVX.js +229 -0
  199. package/dist/vendor/chunk-EGBNVEEW.js +14 -0
  200. package/dist/vendor/chunk-EZWY45HP.js +18 -0
  201. package/dist/vendor/chunk-FNZOJHSV.js +71 -0
  202. package/dist/vendor/chunk-GXCHI7BM.js +131 -0
  203. package/dist/vendor/chunk-IIJ52ZU6.js +20 -0
  204. package/dist/vendor/chunk-J7A4CZDO.js +92 -0
  205. package/dist/vendor/chunk-JG5TTWPT.js +85 -0
  206. package/dist/vendor/chunk-JJ24ARBQ.js +394 -0
  207. package/dist/vendor/chunk-KOZMM5PZ.js +426 -0
  208. package/dist/vendor/chunk-KUUXSID7.js +18 -0
  209. package/dist/vendor/chunk-LEUPYT3Q.js +36 -0
  210. package/dist/vendor/chunk-M32LDTW7.js +18 -0
  211. package/dist/vendor/chunk-M7CLUILA.js +0 -0
  212. package/dist/vendor/chunk-MBSKBQ5D.js +21 -0
  213. package/dist/vendor/chunk-MLKGABMK.js +9 -0
  214. package/dist/vendor/chunk-NBVRTDTV.js +129 -0
  215. package/dist/vendor/chunk-OXNGN5H7.js +81 -0
  216. package/dist/vendor/chunk-QPLDT6A6.js +564 -0
  217. package/dist/vendor/chunk-QYBKAIA6.js +18 -0
  218. package/dist/vendor/chunk-RO2R4MJH.js +62 -0
  219. package/dist/vendor/chunk-SIR62W3Y.js +398 -0
  220. package/dist/vendor/chunk-TFIKFFSC.js +26 -0
  221. package/dist/vendor/chunk-TXKLEBBL.js +143 -0
  222. package/dist/vendor/chunk-UFH5UUZK.js +48 -0
  223. package/dist/vendor/chunk-VANKHF46.js +96 -0
  224. package/dist/vendor/chunk-VZBDV3TV.js +18 -0
  225. package/dist/vendor/chunk-XDKNKFBW.js +22 -0
  226. package/dist/vendor/chunk-XH4U3JSV.js +249 -0
  227. package/dist/vendor/chunk-Y35ZAO5U.js +53 -0
  228. package/dist/vendor/chunk-ZJMRMY57.js +0 -0
  229. package/dist/vendor/cjs/node/NodeChildProcessSpawner.d.ts +7 -0
  230. package/dist/vendor/cjs/node/NodeChildProcessSpawner.js +1 -0
  231. package/dist/vendor/cjs/node/NodeClusterHttp.d.ts +63 -0
  232. package/dist/vendor/cjs/node/NodeClusterHttp.js +1 -0
  233. package/dist/vendor/cjs/node/NodeClusterSocket.d.ts +79 -0
  234. package/dist/vendor/cjs/node/NodeClusterSocket.js +1 -0
  235. package/dist/vendor/cjs/node/NodeCrypto.d.ts +10 -0
  236. package/dist/vendor/cjs/node/NodeCrypto.js +1 -0
  237. package/dist/vendor/cjs/node/NodeFileSystem.d.ts +10 -0
  238. package/dist/vendor/cjs/node/NodeFileSystem.js +1 -0
  239. package/dist/vendor/cjs/node/NodeHttpClient.d.ts +179 -0
  240. package/dist/vendor/cjs/node/NodeHttpClient.js +1 -0
  241. package/dist/vendor/cjs/node/NodeHttpIncomingMessage.d.ts +62 -0
  242. package/dist/vendor/cjs/node/NodeHttpIncomingMessage.js +1 -0
  243. package/dist/vendor/cjs/node/NodeHttpPlatform.d.ts +36 -0
  244. package/dist/vendor/cjs/node/NodeHttpPlatform.js +1 -0
  245. package/dist/vendor/cjs/node/NodeHttpServer.d.ts +120 -0
  246. package/dist/vendor/cjs/node/NodeHttpServer.js +1 -0
  247. package/dist/vendor/cjs/node/NodeHttpServerRequest.d.ts +29 -0
  248. package/dist/vendor/cjs/node/NodeHttpServerRequest.js +1 -0
  249. package/dist/vendor/cjs/node/NodeMultipart.d.ts +46 -0
  250. package/dist/vendor/cjs/node/NodeMultipart.js +1 -0
  251. package/dist/vendor/cjs/node/NodeMultipartParser.d.ts +97 -0
  252. package/dist/vendor/cjs/node/NodeMultipartParser.js +1 -0
  253. package/dist/vendor/cjs/node/NodePath.d.ts +27 -0
  254. package/dist/vendor/cjs/node/NodePath.js +1 -0
  255. package/dist/vendor/cjs/node/NodeRedis.d.ts +74 -0
  256. package/dist/vendor/cjs/node/NodeRedis.js +1 -0
  257. package/dist/vendor/cjs/node/NodeRuntime.d.ts +85 -0
  258. package/dist/vendor/cjs/node/NodeRuntime.js +1 -0
  259. package/dist/vendor/cjs/node/NodeServices.d.ts +34 -0
  260. package/dist/vendor/cjs/node/NodeServices.js +1 -0
  261. package/dist/vendor/cjs/node/NodeSink.d.ts +8 -0
  262. package/dist/vendor/cjs/node/NodeSink.js +1 -0
  263. package/dist/vendor/cjs/node/NodeSocket.d.ts +38 -0
  264. package/dist/vendor/cjs/node/NodeSocket.js +1 -0
  265. package/dist/vendor/cjs/node/NodeSocketServer.d.ts +8 -0
  266. package/dist/vendor/cjs/node/NodeSocketServer.js +1 -0
  267. package/dist/vendor/cjs/node/NodeStdio.d.ts +11 -0
  268. package/dist/vendor/cjs/node/NodeStdio.js +1 -0
  269. package/dist/vendor/cjs/node/NodeStream.d.ts +8 -0
  270. package/dist/vendor/cjs/node/NodeStream.js +1 -0
  271. package/dist/vendor/cjs/node/NodeTerminal.d.ts +21 -0
  272. package/dist/vendor/cjs/node/NodeTerminal.js +1 -0
  273. package/dist/vendor/cjs/node/NodeWorker.d.ts +22 -0
  274. package/dist/vendor/cjs/node/NodeWorker.js +1 -0
  275. package/dist/vendor/cjs/node/NodeWorkerRunner.d.ts +12 -0
  276. package/dist/vendor/cjs/node/NodeWorkerRunner.js +1 -0
  277. package/dist/vendor/cjs/node/Undici.d.ts +28 -0
  278. package/dist/vendor/cjs/node/Undici.js +1 -0
  279. package/dist/vendor/cjs/node/index.d.ts +100 -0
  280. package/dist/vendor/cjs/node/index.js +1 -0
  281. package/dist/vendor/cjs/node-shared/NodeChildProcessSpawner.d.ts +57 -0
  282. package/dist/vendor/cjs/node-shared/NodeChildProcessSpawner.js +1 -0
  283. package/dist/vendor/cjs/node-shared/NodeClusterSocket.d.ts +22 -0
  284. package/dist/vendor/cjs/node-shared/NodeClusterSocket.js +1 -0
  285. package/dist/vendor/cjs/node-shared/NodeCrypto.d.ts +27 -0
  286. package/dist/vendor/cjs/node-shared/NodeCrypto.js +1 -0
  287. package/dist/vendor/cjs/node-shared/NodeFileSystem.d.ts +11 -0
  288. package/dist/vendor/cjs/node-shared/NodeFileSystem.js +1 -0
  289. package/dist/vendor/cjs/node-shared/NodeHttpCompression.d.ts +36 -0
  290. package/dist/vendor/cjs/node-shared/NodeHttpCompression.js +1 -0
  291. package/dist/vendor/cjs/node-shared/NodePath.d.ts +27 -0
  292. package/dist/vendor/cjs/node-shared/NodePath.js +1 -0
  293. package/dist/vendor/cjs/node-shared/NodeRuntime.d.ts +47 -0
  294. package/dist/vendor/cjs/node-shared/NodeRuntime.js +1 -0
  295. package/dist/vendor/cjs/node-shared/NodeSink.d.ts +69 -0
  296. package/dist/vendor/cjs/node-shared/NodeSink.js +1 -0
  297. package/dist/vendor/cjs/node-shared/NodeSocket.d.ts +134 -0
  298. package/dist/vendor/cjs/node-shared/NodeSocket.js +1 -0
  299. package/dist/vendor/cjs/node-shared/NodeSocketServer.d.ts +80 -0
  300. package/dist/vendor/cjs/node-shared/NodeSocketServer.js +1 -0
  301. package/dist/vendor/cjs/node-shared/NodeStdio.d.ts +12 -0
  302. package/dist/vendor/cjs/node-shared/NodeStdio.js +1 -0
  303. package/dist/vendor/cjs/node-shared/NodeStream.d.ts +179 -0
  304. package/dist/vendor/cjs/node-shared/NodeStream.js +1 -0
  305. package/dist/vendor/cjs/node-shared/NodeTerminal.d.ts +22 -0
  306. package/dist/vendor/cjs/node-shared/NodeTerminal.js +1 -0
  307. package/dist/vendor/cjs/node-shared/index.d.ts +56 -0
  308. package/dist/vendor/cjs/node-shared/index.js +1 -0
  309. package/dist/vendor/cjs/node-shared/internal/nodeChildProcessSpawner.d.ts +4 -0
  310. package/dist/vendor/cjs/node-shared/internal/nodeChildProcessSpawner.js +1 -0
  311. package/dist/vendor/cjs/node-shared/internal/utils.d.ts +2 -0
  312. package/dist/vendor/cjs/node-shared/internal/utils.js +1 -0
  313. package/dist/vendor/cjs/package.json +1 -0
  314. package/dist/vendor/cjs/platform-node-shared.d.ts +56 -0
  315. package/dist/vendor/cjs/platform-node-shared.js +1 -0
  316. package/dist/vendor/cjs/platform-node.d.ts +100 -0
  317. package/dist/vendor/cjs/platform-node.js +1 -0
  318. package/dist/vendor/node/LICENSE +21 -0
  319. package/dist/vendor/node/NodeChildProcessSpawner.d.ts +7 -0
  320. package/dist/vendor/node/NodeChildProcessSpawner.js +14 -0
  321. package/dist/vendor/node/NodeClusterHttp.d.ts +63 -0
  322. package/dist/vendor/node/NodeClusterHttp.js +43 -0
  323. package/dist/vendor/node/NodeClusterSocket.d.ts +79 -0
  324. package/dist/vendor/node/NodeClusterSocket.js +30 -0
  325. package/dist/vendor/node/NodeCrypto.d.ts +10 -0
  326. package/dist/vendor/node/NodeCrypto.js +8 -0
  327. package/dist/vendor/node/NodeFileSystem.d.ts +10 -0
  328. package/dist/vendor/node/NodeFileSystem.js +9 -0
  329. package/dist/vendor/node/NodeHttpClient.d.ts +179 -0
  330. package/dist/vendor/node/NodeHttpClient.js +46 -0
  331. package/dist/vendor/node/NodeHttpIncomingMessage.d.ts +62 -0
  332. package/dist/vendor/node/NodeHttpIncomingMessage.js +10 -0
  333. package/dist/vendor/node/NodeHttpPlatform.d.ts +36 -0
  334. package/dist/vendor/node/NodeHttpPlatform.js +16 -0
  335. package/dist/vendor/node/NodeHttpServer.d.ts +120 -0
  336. package/dist/vendor/node/NodeHttpServer.js +46 -0
  337. package/dist/vendor/node/NodeHttpServerRequest.d.ts +29 -0
  338. package/dist/vendor/node/NodeHttpServerRequest.js +9 -0
  339. package/dist/vendor/node/NodeMultipart.d.ts +46 -0
  340. package/dist/vendor/node/NodeMultipart.js +15 -0
  341. package/dist/vendor/node/NodeMultipartParser.d.ts +97 -0
  342. package/dist/vendor/node/NodeMultipartParser.js +11 -0
  343. package/dist/vendor/node/NodePath.d.ts +27 -0
  344. package/dist/vendor/node/NodePath.js +12 -0
  345. package/dist/vendor/node/NodeRedis.d.ts +74 -0
  346. package/dist/vendor/node/NodeRedis.js +11 -0
  347. package/dist/vendor/node/NodeRuntime.d.ts +85 -0
  348. package/dist/vendor/node/NodeRuntime.js +8 -0
  349. package/dist/vendor/node/NodeServices.d.ts +34 -0
  350. package/dist/vendor/node/NodeServices.js +23 -0
  351. package/dist/vendor/node/NodeSink.d.ts +8 -0
  352. package/dist/vendor/node/NodeSink.js +12 -0
  353. package/dist/vendor/node/NodeSocket.d.ts +38 -0
  354. package/dist/vendor/node/NodeSocket.js +31 -0
  355. package/dist/vendor/node/NodeSocketServer.d.ts +8 -0
  356. package/dist/vendor/node/NodeSocketServer.js +21 -0
  357. package/dist/vendor/node/NodeStdio.d.ts +11 -0
  358. package/dist/vendor/node/NodeStdio.js +10 -0
  359. package/dist/vendor/node/NodeStream.d.ts +8 -0
  360. package/dist/vendor/node/NodeStream.js +27 -0
  361. package/dist/vendor/node/NodeTerminal.d.ts +21 -0
  362. package/dist/vendor/node/NodeTerminal.js +10 -0
  363. package/dist/vendor/node/NodeWorker.d.ts +22 -0
  364. package/dist/vendor/node/NodeWorker.js +9 -0
  365. package/dist/vendor/node/NodeWorkerRunner.d.ts +12 -0
  366. package/dist/vendor/node/NodeWorkerRunner.js +7 -0
  367. package/dist/vendor/node/Undici.d.ts +28 -0
  368. package/dist/vendor/node/Undici.js +9 -0
  369. package/dist/vendor/node/index.d.ts +100 -0
  370. package/dist/vendor/node/index.js +115 -0
  371. package/dist/vendor/node-shared/LICENSE +21 -0
  372. package/dist/vendor/node-shared/NodeChildProcessSpawner.d.ts +57 -0
  373. package/dist/vendor/node-shared/NodeChildProcessSpawner.js +13 -0
  374. package/dist/vendor/node-shared/NodeClusterSocket.d.ts +22 -0
  375. package/dist/vendor/node-shared/NodeClusterSocket.js +11 -0
  376. package/dist/vendor/node-shared/NodeCrypto.d.ts +27 -0
  377. package/dist/vendor/node-shared/NodeCrypto.js +9 -0
  378. package/dist/vendor/node-shared/NodeFileSystem.d.ts +11 -0
  379. package/dist/vendor/node-shared/NodeFileSystem.js +8 -0
  380. package/dist/vendor/node-shared/NodeHttpCompression.d.ts +36 -0
  381. package/dist/vendor/node-shared/NodeHttpCompression.js +13 -0
  382. package/dist/vendor/node-shared/NodePath.d.ts +27 -0
  383. package/dist/vendor/node-shared/NodePath.js +11 -0
  384. package/dist/vendor/node-shared/NodeRuntime.d.ts +47 -0
  385. package/dist/vendor/node-shared/NodeRuntime.js +7 -0
  386. package/dist/vendor/node-shared/NodeSink.d.ts +69 -0
  387. package/dist/vendor/node-shared/NodeSink.js +11 -0
  388. package/dist/vendor/node-shared/NodeSocket.d.ts +134 -0
  389. package/dist/vendor/node-shared/NodeSocket.js +23 -0
  390. package/dist/vendor/node-shared/NodeSocketServer.d.ts +80 -0
  391. package/dist/vendor/node-shared/NodeSocketServer.js +20 -0
  392. package/dist/vendor/node-shared/NodeStdio.d.ts +12 -0
  393. package/dist/vendor/node-shared/NodeStdio.js +9 -0
  394. package/dist/vendor/node-shared/NodeStream.d.ts +179 -0
  395. package/dist/vendor/node-shared/NodeStream.js +26 -0
  396. package/dist/vendor/node-shared/NodeTerminal.d.ts +22 -0
  397. package/dist/vendor/node-shared/NodeTerminal.js +9 -0
  398. package/dist/vendor/node-shared/index.d.ts +56 -0
  399. package/dist/vendor/node-shared/index.js +58 -0
  400. package/dist/vendor/node-shared/internal/nodeChildProcessSpawner.d.ts +4 -0
  401. package/dist/vendor/node-shared/internal/nodeChildProcessSpawner.js +7 -0
  402. package/dist/vendor/node-shared/internal/utils.d.ts +2 -0
  403. package/dist/vendor/node-shared/internal/utils.js +7 -0
  404. package/dist/vendor/platform-node-shared.d.ts +56 -0
  405. package/dist/vendor/platform-node-shared.js +58 -0
  406. package/dist/vendor/platform-node.d.ts +100 -0
  407. package/dist/vendor/platform-node.js +115 -0
  408. package/docs/README.md +129 -0
  409. package/docs/api.md +553 -0
  410. package/docs/concepts/descriptor-relative-filesystem.md +181 -0
  411. package/docs/concepts/host-bundle.md +125 -0
  412. package/docs/concepts/process-containment.md +190 -0
  413. package/docs/guides/answer-run-ownership.md +87 -0
  414. package/docs/guides/configure-the-filesystem-helper.md +152 -0
  415. package/docs/guides/contain-child-processes.md +139 -0
  416. package/docs/guides/match-files-with-glob.md +151 -0
  417. package/docs/installation.md +204 -0
  418. package/docs/quickstart.md +147 -0
  419. package/docs/troubleshooting.md +130 -0
  420. package/package.json +202 -3
  421. package/src/AtomicFileSystem.ts +415 -0
  422. package/src/EgressHttpClient.ts +327 -0
  423. package/src/HostLiveness.ts +103 -0
  424. package/src/NodeHost.ts +253 -0
  425. package/src/ProcessConfinement.ts +363 -0
  426. package/src/ProcessReaper.ts +951 -0
  427. package/src/ProcessSandbox.ts +1307 -0
  428. package/src/ScopedProcess.ts +124 -0
  429. package/src/index.ts +44 -0
  430. package/src/internal/AtomicFileSystemExecutable.ts +379 -0
  431. package/src/internal/AtomicFileSystemProtocol.ts +502 -0
  432. package/src/internal/AtomicFileSystemTransport.ts +272 -0
  433. package/src/internal/AtomicHelperError.ts +50 -0
  434. package/src/internal/AtomicHelperFault.ts +84 -0
  435. package/src/internal/PipedProcess.ts +357 -0
  436. package/src/internal/ProcSnapshot.ts +193 -0
  437. package/src/internal/ProcessCleanup.ts +99 -0
  438. package/src/internal/ProcessCleanupPolicyError.ts +30 -0
  439. package/src/internal/ProcessFault.ts +82 -0
  440. package/src/internal/ProcessSupervisor.ts +807 -0
  441. package/src/internal/SupervisorProgram.ts +309 -0
  442. package/src/internal/WindowsProcessJob.ts +114 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProcessSupervisor.js","sourceRoot":"","sources":["../../../src/internal/ProcessSupervisor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,aAAa,MAAM,sBAAsB,CAAA;AACrD,OAAO,KAAK,IAAI,MAAM,aAAa,CAAA;AACnC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,YAAY,MAAM,sCAAsC,CAAA;AACpE,OAAO,EAA2B,QAAQ,EAAE,UAAU,EAAE,MAAM,6CAA6C,CAAA;AAC3G,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AACnE,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAe,MAAM,UAAU,CAAA;AACtE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAChD,OAAO,KAAK,GAAG,MAAM,UAAU,CAAA;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEjD,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACpE,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAC/C,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAEhF,MAAM,SAAS,GAAG,IAAI,CAAA;AACtB,MAAM,UAAU,GAAG,GAAG,CAAA;AACtB,MAAM,eAAe,GAAG,IAAI,CAAA;AAC5B,4EAA4E;AAC5E,6EAA6E;AAC7E,yEAAyE;AACzE,MAAM,cAAc,GAAG,IAAI,CAAA;AAC3B,MAAM,OAAO,GAAG,IAAI,OAAO,EAA+B,CAAA;AAC1D,4EAA4E;AAC5E,yEAAyE;AACzE,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,YAAY,EAAE,CAAA;AAE/C;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,MAA0B,EAAsB,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,SAAS,CAAA;AAE7G,yEAAyE;AACzE,MAAM,WAAW,GAAG,CAAC,KAAc,EAAuE,EAAE;IAC1G,IAAI,KAAK,YAAY,KAAK;QAAE,OAAO,KAAK,CAAA;IACxC,MAAM,KAAK,GAAG,CAAC,KAAK,IAAI,EAAE,CAA4B,CAAA;IACtD,MAAM,IAAI,GAAG,CAAC,KAAa,EAAsB,EAAE,CAAC,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAC/G,OAAO,IAAI,kBAAkB,CAAC;QAC5B,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,+BAA+B;QAC3D,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;QAClB,KAAK,EAAE,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;QAChE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC;QACtB,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC;QACxB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;QAClB,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC;KACvB,CAAC,CAAA;AACJ,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,MAAc,EAAE,OAAe,EAAE,KAAc,EAA+B,EAAE;IACtG,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,CAAA;IAChC,MAAM,IAAI,GAA2D;QACnE,MAAM,EAAE,UAAU;QAClB,MAAM,EAAE,kBAAkB;QAC1B,MAAM,EAAE,eAAe;QACvB,MAAM,EAAE,aAAa;QACrB,OAAO,EAAE,aAAa;QACtB,KAAK,EAAE,aAAa;QACpB,KAAK,EAAE,MAAM;KACd,CAAA;IACD,OAAO,aAAa,CAAC,WAAW,CAAC;QAC/B,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,SAAS;QACzC,MAAM,EAAE,cAAc;QACtB,MAAM;QACN,gBAAgB,EAAE,OAAO;QACzB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,WAAW,EAAE,KAAK,CAAC,OAAO;QAC1B,KAAK,EAAE,KAAK;KACb,CAAC,CAAA;AACJ,CAAC,CAAA;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,OAKC,EACD,eAAwB,EACxB,MAAe,EACf,QAA8B,EACtB,EAAE,CACV;IACE,kBAAkB,OAAO,CAAC,UAAU,EAAE;IACtC,oBACE,OAAO,CAAC,aAAa;QACnB,CAAC,CAAC,QAAQ;QACV,CAAC,CAAC,CAAC,eAAe;YAClB,CAAC,CAAC,cAAc;YAChB,CAAC,CAAC,OAAO,CAAC,mBAAmB;gBAC7B,CAAC,CAAC,cAAc;gBAChB,CAAC,CAAC,SACN,EAAE;IACF,iBAAiB,MAAM,EAAE;IACzB,QAAQ,KAAK,SAAS;QACpB,CAAC,CAAC,6BAA6B;QAC/B,CAAC,CAAC,kBACA,QAAQ,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;YAC3B,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CACtG,gBAAgB,QAAQ,CAAC,QAAQ,EAAE;IACrC,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS;QAC7B,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,CAAC,UAAU,MAAM,CAAE,OAAO,CAAC,KAA+B,EAAE,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;CAC9F,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAEd,MAAM,OAAO,GAAG,GAAM,EAAE;IACtB,IAAI,OAA4B,CAAA;IAChC,IAAI,MAAiC,CAAA;IACrC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAI,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE;QACzC,OAAO,GAAG,GAAG,CAAA;QACb,MAAM,GAAG,EAAE,CAAA;IACb,CAAC,CAAC,CAAA;IACF,iEAAiE;IACjE,KAAK,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;IAC5B,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAA;AACrC,CAAC,CAAA;AAED,MAAM,IAAI,GAAG,CAAI,KAAiB,EAAE,MAAc,EAAE,OAAe,EAAE,EAAE,CACrE,MAAM,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,CAAA;AAE5F,MAAM,OAAO,GAAG,CAAU,MAA8B,EAAE,MAAc,EAAE,MAAc,EAAE,OAAe,EAAE,EAAE,CAC3G,MAAM,CAAC,IAAI,CACT,MAAM,CAAC,aAAa,CAAC;IACnB,QAAQ,EAAE,MAAM;IAChB,MAAM,EAAE,GAAG,EAAE,CACX,MAAM,CAAC,IAAI,CACT,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC,oBAAoB,EAAE,sBAAsB,MAAM,YAAY,CAAC,CAAC,CACvG;CACJ,CAAC,EACF,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,EAAE,YAAY,CAAC,CACjD,CAAA;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,OAAgF,EAAE,EAAE,CACrH,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;IAChD,CAAC,CAAC,MAAM,CAAC,IAAI,CACX,OAAO,CACL,OAAO,EACP,OAAO,CAAC,QAAQ,EAChB,YAAY,CACV,qBAAqB,EACrB,2FAA2F,CAC5F,CACF,CACF;IACD,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,EAAE,oBAAoB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;AAEhF,MAAM,kBAAkB,GAAG,0BAA0B,CAAA;AACrD,MAAM,UAAU,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,wBAAwB,EAAW,CAAA;AAE/G;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAY,EAAE,WAAyD,EAAU,EAAE;IAC9G,MAAM,OAAO,GAAG,WAAW,CAAC,kBAAkB,CAAC,CAAA;IAC/C,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAA;IACxD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAsD,CAAA;IACxF,OAAO,GAAG,CAAC,OAAO,CAAC;QACjB,GAAG,UAAU;QACb,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM;QAC7D,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;KAC1F,CAAC,CAAA;AACJ,CAAC,CAAA;AAED;;;;;GAKG;AACH,MAAM,OAAO,OAAO;IACT,KAAK,GAAG,OAAO,EAAU,CAAA;IACzB,OAAO,GAAG,OAAO,EAAQ,CAAA;IACzB,MAAM,GAAG,OAAO,EAAY,CAAA;IAC5B,IAAI,GAAG,OAAO,EAAS,CAAA;IACvB,KAAK,GAAG,OAAO,EAAQ,CAAA;IACvB,aAAa,GAAG,OAAO,EAAQ,CAAA;IAC/B,SAAS,CAAQ;IACjB,IAAI,CAAQ;IACZ,WAAW,CAAQ;IACnB,MAAM,CAAA;IACN,aAAa,CAAA;IACb,SAAS,CAAe;IAChB,GAAG,CAAoB;IACvB,WAAW,GAAG,IAAI,GAAG,EAAU,CAAA;IAChD,MAAM,CAAoB;IAC1B,aAAa,CAAoB;IACjC,UAAU,GAAG,KAAK,CAAA;IAClB,aAAa,CAAS;IACtB,SAAS,CAAoB;IAC7B,6EAA6E;IAC7E,WAAW,CAAoB;IAC/B,SAAS,GAAG,KAAK,CAAA;IACjB,WAAW,GAAG,KAAK,CAAA;IACnB,aAAa,GAAG,KAAK,CAAA;IACrB,mBAAmB,GAAG,KAAK,CAAA;IAC3B,cAAc,GAAG,KAAK,CAAA;IACtB,SAAS,GAAG,KAAK,CAAA;IACjB,KAAK,CAAS;IACd,YAAY,GAAe,GAAG,EAAE,GAAE,CAAC,CAAA;IACnC,SAAS,GAAe,GAAG,EAAE,GAAE,CAAC,CAAA;IACxB,aAAa,GAAG,KAAK,CAAA;IACrB,eAAe,GAAG,KAAK,CAAA;IACvB,SAAS,GAAG,KAAK,CAAA;IAEzB,YAAY,YAA8B,QAAQ;QAChD,IAAI,CAAC,GAAG,GAAG,SAAS,KAAK,KAAK,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QAC5F,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,OAAO,CAAC,CAAC,CAAA;QAC7F,IAAI,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,IAAI,CAAA;QACjC,IAAI,CAAC,WAAW,GAAG,GAAG,IAAI,CAAC,SAAS,IAAI,CAAA;QACxC,MAAM,OAAO,GAA2C,EAAE,CAAA;QAC1D,IAAI,CAAC;YACH,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;YAChC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;YAC9D,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YACzB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAA;YAC7E,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;YAChC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC;gBAC3B,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;oBACpC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;oBACjC,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS;wBAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;;wBAC7D,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,CAAA;gBAClD,CAAC,CAAC;gBACF,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;oBACpC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;oBACxC,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS;wBAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;;wBAC3E,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,CAAA;gBACzD,CAAC,CAAC;aACH,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,KAAK,MAAM,MAAM,IAAI,OAAO;gBAAE,MAAM,CAAC,KAAK,EAAE,CAAA;YAC5C,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;YACxD,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;IAEO,UAAU,CAAC,MAAgC;QACjD,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS;YAAE,OAAO,YAAY,CAAC,MAAM,CAAC,CAAA;QACvD,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC;YAC9B,GAAG,UAAU;YACb,gBAAgB,EAAE,SAAS;YAC3B,WAAW,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,CAAC,QAAQ,KAAK,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAI,CAAC,CAAC,CAAC,IAAI;SACrF,EAAE,MAAM,CAAC,CAAA;QACV,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE;YACjC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;YAC5B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;QAC7D,CAAC,CAAC,CAAA;QACF,MAAM,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA;QACjE,OAAO,MAAM,CAAA;IACf,CAAC;IAED,0FAA0F;IAC1F,WAAW;QACT,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS;YAAE,OAAO,EAAE,CAAA;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAsB,CAAA;QACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,EAAsB,CAAA;QACjE,OAAO;YACL,CAAC,kBAAkB,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAC7B,MAAM,EAAE,MAAM,CAAC,IAAI;gBACnB,QAAQ,EAAE,QAAQ,CAAC,IAAI;aACxB,CAAC;SACH,CAAA;IACH,CAAC;IAED,iFAAiF;IACjF,OAAO,CAAC,QAAQ,GAAG,KAAK;QACtB,OAAO,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;IAClF,CAAC;IAED,iFAAiF;IACjF,QAAQ,CAAC,GAAW,EAAE,MAAc;QAClC,IAAI,GAAG,KAAK,MAAM;YAAE,MAAM,YAAY,CAAC,mBAAmB,EAAE,2BAA2B,CAAC,CAAA;QACxF,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;QACnB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;QACnB,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAA;QAC1B,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAA;QAC1B,wEAAwE;QACxE,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QAClC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QACzC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACzB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;IACvB,CAAC;IAED,gFAAgF;IAChF,UAAU;QACR,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,CAAA;IAC/B,CAAC;IAED,OAAO;QACL,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,WAAW;YAAE,MAAM,CAAC,OAAO,EAAE,CAAA;QACvD,IAAI,CAAC,UAAU,EAAE,CAAA;QACjB,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAA;QACtB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;QACnB,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAA;QAC1B,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IAC/E,CAAC;IAED,QAAQ;QACN,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;QACrB,4EAA4E;QAC5E,uEAAuE;QACvE,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,MAAM,EAAE,CAAA;IAC9C,CAAC;IAED,KAAK,CAAC,OAAgB;QACpB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAA;YACjC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACjE,MAAM,CAAC,YAAY,CAAC,wBAAwB,EAAE,wCAAwC,CAAC,CAAC,CAAA;gBACxF,OAAM;YACR,CAAC;YACD,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAA;YAC3C,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;gBAC9C,MAAM,CAAC,YAAY,CAAC,yBAAyB,EAAE,uDAAuD,CAAC,CAAC,CAAA;gBACxG,OAAM;YACR,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;QAClE,CAAC,CAAC,CAAA;IACJ,CAAC;IAEO,MAAM;QACZ,IAAI,CAAC,UAAU,EAAE,CAAA;QACjB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK;YACtB,YAAY,CAAC,iBAAiB,EAAE,wDAAwD,CAAC,CAAA;QAC3F,IAAI,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACzF,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACxB,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAChC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAC1B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACzB,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAA;IACtB,CAAC;IAEO,cAAc,CAAC,MAAc;QACnC,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACrC,MAAM,CAAC,OAAO,EAAE,CAAA;YAChB,OAAM;QACR,CAAC;QACD,IAAI,CAAC,aAAa,GAAG,MAAM,CAAA;QAC3B,yEAAyE;QACzE,wEAAwE;QACxE,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC3B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QACpB,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAA;IAC9B,CAAC;IAEO,MAAM,CAAC,MAAc;QAC3B,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,CAAC,OAAO,EAAE,CAAA;YAChB,OAAM;QACR,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,MAAM,GAAG,EAAE,CAAA;QACf,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;QAC1B,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YACjC,IAAI,CAAC;gBACH,MAAM,IAAI,IAAI,CAAA;gBACd,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;oBAC1C,MAAM,YAAY,CAAC,kBAAkB,EAAE,wCAAwC,CAAC,CAAA;gBAClF,CAAC;gBACD,SAAS,CAAC;oBACR,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;oBAChC,IAAI,GAAG,GAAG,CAAC;wBAAE,MAAK;oBAClB,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;oBACjC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAA;oBAC9B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;gBAChC,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;gBAClB,MAAM,CAAC,OAAO,EAAE,CAAA;YAClB,CAAC;QACH,CAAC,CAAC,CAAA;QACF,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC3B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QACpB,CAAC,CAAC,CAAA;QACF,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAA;IAC3C,CAAC;IAEO,OAAO,CAAC,KAAc;QAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;YAAE,MAAM,YAAY,CAAC,gBAAgB,EAAE,wBAAwB,CAAC,CAAA;QAC/G,MAAM,OAAO,GAAG,KAAgC,CAAA;QAChD,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;YACrB,KAAK,OAAO;gBACV,IACE,IAAI,CAAC,aAAa,IAAI,OAAO,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAC7G,CAAC;oBACD,MAAM,YAAY,CAAC,gBAAgB,EAAE,2BAA2B,CAAC,CAAA;gBACnE,CAAC;gBACD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAA;gBACzB,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,OAAO,CAAA;gBACpC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAA;gBACvC,OAAM;YACR,KAAK,SAAS;gBACZ,IACE,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,eAAe,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC;oBAClF,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;oBACxB,OAAO,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAC5G,CAAC;oBACD,MAAM,YAAY,CAAC,gBAAgB,EAAE,wBAAwB,CAAC,CAAA;gBAChE,CAAC;gBACD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAA;gBAC3B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;gBACpC,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS;oBAAE,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;gBAC/E,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAA;gBACtB,OAAM;YACR,KAAK,aAAa;gBAChB,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;oBACjD,MAAM,YAAY,CAAC,gBAAgB,EAAE,8BAA8B,CAAC,CAAA;gBACtE,CAAC;gBACD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;gBACvB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAA;gBACpB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;gBAC5B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;gBAC3B,OAAM;YACR,KAAK,OAAO;gBACV,IAAI,CAAC,KAAK,GAAG,OAAO,CAAA;gBACpB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;gBAC5B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;gBAC3B,OAAM;YACR,KAAK,MAAM;gBACT,IACE,CAAC,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,UAAU;oBACxC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI;wBACtF,OAAO,CAAC,IAAI,KAAK,IAAI,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EACvG,CAAC;oBACD,MAAM,YAAY,CAAC,gBAAgB,EAAE,4BAA4B,CAAC,CAAA;gBACpE,CAAC;gBACD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;gBACtB,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;oBAC1B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;wBACjB,OAAO,EAAE,kDAAkD,OAAO,CAAC,MAAM,GAAG;wBAC5E,MAAM,EAAE,OAAO,CAAC,MAAM;qBACvB,CAAC,CAAA;gBACJ,CAAC;;oBAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBAC1D,IAAI,CAAC,YAAY,EAAE,CAAA;gBACnB,OAAM;YACR,KAAK,eAAe;gBAClB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAA;gBACzB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAA;gBACpB,OAAM;YACR,KAAK,SAAS;gBACZ,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAA;gBAC/B,IAAI,CAAC,SAAS,EAAE,CAAA;gBAChB,OAAM;YACR;gBACE,MAAM,YAAY,CAAC,gBAAgB,EAAE,wBAAwB,CAAC,CAAA;QAClE,CAAC;IACH,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CACrB,MAAc,EACd,MAGuD,EACvD,YAA8B,QAAQ,EAC3B,EAAE,CACf,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CACjB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAC9C,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,KAAK,SAAS,CAAA;IAC9C,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;QAClD,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC;QAC7B,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC;KAC5D,CAAC,CAAC,CAAC,KAAK,EAAE,CAAA;IACX,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,kBAAkB,CAAC;QAC1C,GAAG;QACH,GAAG;QACH,IAAI,EAAG,UAA4D,CAAC,GAAG,EAAE,IAAI,IAAI,EAAE;KACpF,CAAC,CAAA;IACF,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAA;IAC3C,MAAM,OAAO,GAAG,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAA;IAC9D,MAAM,aAAa,GAAG,OAAO,CAAC,CAAC;QAC7B,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;YAChB,GAAG,EAAE,oBAAoB;YACzB,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC;SAC3D,CAAC,CAAC,CAAC;QACJ,SAAS,CAAA;IACX,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,cAAc,CAC1C,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,OAAO,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,EAC7G,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAClD,CAAA;IACD,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;IACtG,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE;QAC3D,GAAG,SAAS;QACZ,IAAI;QACJ,MAAM;QACN,OAAO,CAAC,IAAI;QACZ,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ;KAC7B,EAAE;QACD,GAAG,OAAO,CAAC,OAAO;QAClB,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI;QACjC,GAAG,EAAE;YACH,IAAI,EAAE,eAAe;YACrB,IAAI,EAAE,GAAG;YACT,eAAe,EAAE,GAAG;YACpB,iCAAiC,EAAE,GAAG;YACtC,GAAG,OAAO,CAAC,WAAW,EAAE;YACxB,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,2BAA2B,EAAE,aAAa,EAAE,CAAC;SACvF;QACD,SAAS,EAAE,KAAK;QAChB,KAAK,EAAE,KAAK;QACZ,QAAQ,EAAE,OAAO;QACjB,UAAU,EAAE,SAAS;QACrB,cAAc,EAAE,OAAO,CAAC,OAAO;KAChC,CAAC,CAAC,CAAA;IACH,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;IAC/G,IAAI,GAAkC,CAAA;IACtC,IAAI,OAAO,GAAG,KAAK,CAAA;IACnB,IAAI,UAAU,GAAG,IAAI,CAAA;IACrB,IAAI,KAAK,GAAqD,MAAM,CAAC,IAAI,CAAA;IACzE,IAAI,QAAQ,GAAG,OAAO,CAAA;IACtB,IAAI,qBAAqB,GAAG,KAAK,CAAA;IACjC,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC/C,MAAM,KAAK,GAAG,GAAG,EAAE;QACjB,IAAI,CAAC,OAAO;YAAE,OAAO,OAAO,CAAC,UAAU,CAAA;QACvC,MAAM,QAAQ,GAAG,QAAQ,EAAE,CAAA;QAC3B,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,QAAQ,KAAK,GAAG,CAAC,GAAG;YAAE,OAAO,KAAK,CAAA;QACzE,4DAA4D;QAC5D,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,GAAG,KAAK,OAAO,CAAC,WAAW,CAAC,CAAA;QACzG,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,CAAE,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,CAAA;IAC5D,CAAC,CAAA;IACD,4EAA4E;IAC5E,6EAA6E;IAC7E,OAAO,CAAC,YAAY,GAAG,GAAG,EAAE;QAC1B,sEAAsE;QACtE,qEAAqE;QACrE,IAAI,OAAO,CAAC,SAAS;YAAE,OAAM;QAC7B,IAAI,CAAC,KAAK,EAAE;YAAE,OAAM;QACpB,OAAO,CAAC,SAAS,GAAG,IAAI,CAAA;QACxB,KAAK,OAAO,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAA;IAC3G,CAAC,CAAA;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACtD,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,OAAO,GAAG,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CACzG,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CACrB,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAC3D,mEAAmE;YACnE,GAAI,CAAC,IAAI,EAAE,CAAA;YACX,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;QACrF,CAAC,CAAC,CACH,CACF,CAAA;QACD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;YACjG,OAAO,GAAG,IAAI,CAAA;YACd,OAAM;QACR,CAAC;QACD,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAC5G,MAAM,CAAC,MAAM,CACd,CAAA;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,CAAA;QAC5C,SAAS,CAAC;YACR,iEAAiE;YACjE,uEAAuE;YACvE,uEAAuE;YACvE,mEAAmE;YACnE,+CAA+C;YAC/C,MAAM,MAAM,GAAG,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAChD,MAAM,QAAQ,GAAG,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;YAC5D,OAAO,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,CAAC,CAAC,qBAAqB,IAAI,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO;gBACrG,CAAC,CAAC,MAAM;oBACN,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,QAAQ,KAAK,GAAG,CAAC,GAAG,IAAI,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;gBAC9G,CAAC,CAAC,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,WAAW,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAA;YACzE,IAAI,OAAO;gBAAE,OAAM;YACnB,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,EAAE,CAAC;gBAC3B,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CACvB,OAAO,CACL,MAAM,EACN,OAAO,CAAC,OAAO,EACf,YAAY,CACV,oBAAoB,EACpB,uEAAuE;oBACrE,IAAI,iBAAiB,CAAC,OAAO,EAAE,qBAAqB,EAAE,MAAM,EAAE,QAAQ,CAAC,GAAG,EAC5E;oBACE,KAAK,EAAE;wBACL,KAAK,EAAE,OAAO,CAAC,KAAK;wBACpB,aAAa,EAAE,OAAO,CAAC,aAAa;wBACpC,eAAe,EAAE,qBAAqB;wBACtC,mBAAmB,EAAE,OAAO,CAAC,mBAAmB;wBAChD,UAAU,EAAE,OAAO,CAAC,UAAU;wBAC9B,WAAW,EAAE,MAAM;wBACnB,aAAa,EAAE,QAAQ,KAAK,SAAS;wBACrC,OAAO,EAAE,QAAQ,EAAE,OAAO;qBAC3B;iBACF,CACF,CACF,CACF,CAAA;YACH,CAAC;YACD,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAA;QAChF,CAAC;IACH,CAAC,CAAC,CAAC,CAAA;IACH,MAAM,IAAI,GAAG,CAAC,UAAoC,EAAE,EAAE,EAAE,CACtD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;QACzD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,GAAG,EAAE,SAAS,CAAC,IAAI,CAAC,CAAA;YACpB,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,CAAA;YACrB,OAAO,CAAC,aAAa,EAAE,GAAG,EAAE,CAAA;YAC5B,KAAK,CAAC,CAAC,KAAK,CAAA;YACZ,UAAU,GAAG,IAAI,CAAA;QACnB,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YACvB,OAAO,CAAC,SAAS,GAAG,IAAI,CAAA;YACxB,QAAQ,GAAG,SAAS,CAAA;YACpB,sEAAsE;YACtE,sEAAsE;YACtE,+CAA+C;YAC/C,qBAAqB,GAAG,OAAO,IAAI,OAAO,CAAC,cAAc,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,OAAO,CAAC,UAAU,CAAA;YACxG,KAAK,CAAC,CAAC,OAAO,CACZ,IAAI,CACF,OAAO,CAAC,KAAK,CAAC;gBACZ,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,IAAI;gBACd,GAAG,SAAS;gBACZ,0DAA0D;gBAC1D,6DAA6D;gBAC7D,4DAA4D;gBAC5D,UAAU,EAAE,CAAC,OAAO,CAAC,cAAc,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU;aAClF,CAAC,EACF,MAAM,EACN,OAAO,CAAC,OAAO,CAChB,EACD,UAAU,EACV,MAAM,EACN,OAAO,CAAC,OAAO,CAChB;iBACE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAA;QACtE,CAAC;QACD,KAAK,CAAC,CAAC,MAAM,CAAA;IACf,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAA;IACjC,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,CAC9B,IAAI,EAAE,CAAC,IAAI;IACT,yEAAyE;IACzE,0EAA0E;IAC1E,MAAM,CAAC,QAAQ,CACb,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAClB,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CACpC,GAAG,CAAC,KAAK,EACT,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;QACf,GAAG,EAAE,IAAI,EAAE,CAAA;QACX,GAAG,EAAE,SAAS,CAAC,KAAK,CAAC,CAAA;QACrB,OAAO,CAAC,UAAU,EAAE,CAAA;IACtB,CAAC,CAAC,CACH,CACF,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CACrB,EACD,MAAM,CAAC,KAAK,CACb,CACF,CAAA;IACD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,OAAO,CAC1B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,EACrD,SAAS,EACT,OAAO,EACP,OAAO,CAAC,OAAO,CAChB,CAAA;IACD,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;IAClH,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;QAChB,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC;QAC3C,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC;KAC3D,CAAC,CAAA;IACF,IAAI,OAAO,EAAE,CAAC;QACZ,GAAG,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;YACtB,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,iBAAiB,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,aAAa,EAAE,aAAc,CAAC;YAChF,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC;SAC3D,CAAC,CAAA;QACF,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;IACxG,CAAC;IACD,MAAM,kBAAkB,GAAG,OAAO,IAAI,SAAS,KAAK,KAAK,CAAA;IACzD,IAAI,kBAAkB,EAAE,CAAC;QACvB,OAAO,CAAC,SAAS,GAAG,GAAG,EAAE;YACvB,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;gBACvB,KAAK,OAAO,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAA;YAC/E,CAAC;QACH,CAAC,CAAA;IACH,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAA;IAC/B,4EAA4E;IAC5E,yEAAyE;IACzE,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;IACtG,KAAK,CAAC,CAAC,OAAO,CACZ,IAAI,CACF,OAAO,CAAC,KAAK,CAAC;QACZ,IAAI,EAAE,WAAW;QACjB,kBAAkB;QAClB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAC1C,GAAG;QACH,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI;QACxC,wBAAwB,EACrB,OAAyF;aACvF,wBAAwB;QAC7B,WAAW,EAAE,aAAa,CAAC,GAAG,CAAC;QAC/B,OAAO,EAAE;YACP,GAAG,IAAI,GAAG,CACR,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,WAAW,CAAC;iBACnE,MAAM,CAAC,CAAC,EAAE,EAAgB,EAAE,CAAC,EAAE,KAAK,SAAS,CAAC,CAClD;SACF;QACD,GAAG,OAAO;KACX,CAAC,EACF,OAAO,EACP,OAAO,CAAC,OAAO,CAChB,EACD,UAAU,EACV,OAAO,EACP,OAAO,CAAC,OAAO,CAChB,CAAA;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACxD,OAAO,CAAC,cAAc,GAAG,IAAI,CAAA;QAC7B,KAAK,CAAC,CAAC,OAAO,CACZ,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,EAChE,UAAU,EACV,OAAO,EACP,OAAO,CAAC,OAAO,CAChB,CAAA;QACD,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;IAC9G,CAAC,CAAC,CAAC,CAAA;IACH,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAChC,IAAI,UAAU,EAAE,CAAC;YACf,KAAK,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,CAAA;YACxB,GAAG,EAAE,SAAS,CAAC,KAAK,CAAC,CAAA;YACrB,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,CAAA;YACvB,OAAO,CAAC,aAAa,EAAE,KAAK,EAAE,CAAA;YAC9B,UAAU,GAAG,KAAK,CAAA;QACpB,CAAC;QACD,OAAO,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YACzB,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,GAAG,EAAE,SAAS,CAAC,IAAI,CAAC,CAAA;gBACpB,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,CAAA;gBACrB,OAAO,CAAC,aAAa,EAAE,GAAG,EAAE,CAAA;gBAC5B,KAAK,CAAC,CAAC,KAAK,CAAA;gBACZ,UAAU,GAAG,IAAI,CAAA;YACnB,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IACF,MAAM,MAAM,GAAG,CAAI,MAAqD,EAAE,EAAE,CAC1E,MAAM,CAAC,IAAI,CACT,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAC1E,CAAA;IACH,MAAM,KAAK,GAAG,CAAI,IAAkE,EAAE,EAAE,CACtF,IAAI,CAAC,WAAW,CACd,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CACvG,CAAA;IACH,MAAM,MAAM,GAAG,UAAU,CAAC;QACxB,GAAG,GAAG;QACN,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,OAAO,CAAC;QACnE,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;QACvE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;QACvB,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC7C,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;QAC1B,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;QAC1B,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;QACpB,WAAW,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAChD,IAAI;QACJ,KAAK;KACN,CAAC,CAAA;IACF,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC5B,OAAO;QACL,MAAM;QACN,QAAQ;QACR,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC;KACpC,CAAA;AACH,CAAC,CAAC,CAAA","sourcesContent":["/**\n * Private parent connection for a POSIX process owner. Effect retains ownership\n * of the caller's streams; separate sockets carry requests and lifetime status.\n * @since 1.0.0\n */\n\nimport type { Lifecycle } from \"@smthrs/kernel/ContainedSpawner\"\nimport * as Channel from \"effect/Channel\"\nimport * as Clock from \"effect/Clock\"\nimport * as Effect from \"effect/Effect\"\nimport * as PlatformError from \"effect/PlatformError\"\nimport * as Sink from \"effect/Sink\"\nimport * as Stream from \"effect/Stream\"\nimport * as ChildProcess from \"effect/unstable/process/ChildProcess\"\nimport { type ChildProcessHandle, ExitCode, makeHandle } from \"effect/unstable/process/ChildProcessSpawner\"\nimport { randomBytes } from \"node:crypto\"\nimport { chmodSync, mkdtempSync, rmdirSync, rmSync } from \"node:fs\"\nimport { createConnection, createServer, type Socket } from \"node:net\"\nimport { tmpdir } from \"node:os\"\nimport { join, parse, resolve } from \"node:path\"\nimport * as Tls from \"node:tls\"\nimport { standardFdsOf } from \"./PipedProcess.ts\"\nimport type { Policy, Snapshot, System } from \"./ProcessCleanup.ts\"\nimport { NativeProcessError, processFault } from \"./ProcessFault.ts\"\nimport { source } from \"./SupervisorProgram.ts\"\nimport { resolveJobExecutable, WindowsProcessJob } from \"./WindowsProcessJob.ts\"\n\nconst startupMs = 5000\nconst deliveryMs = 500\nconst exitAllowanceMs = 2500\n// Host-wide process observations can exceed a socket-delivery deadline on a\n// loaded machine. Keep verification bounded without mistaking that delay for\n// an unclean exit; an unknown observation still never counts as success.\nconst verificationMs = 2500\nconst targets = new WeakMap<ChildProcessHandle, Control>()\n// Native owners and sockets keep running when the caller freezes its Clock.\n// Their delivery bounds and cleanup retries must keep running with them.\nconst processClock = Clock.Clock.defaultValue()\n\n/**\n * Actual service pid, distinct from the owner recorded by the host.\n * @private\n * @since 1.0.0\n */\nexport const targetPidOf = (handle: ChildProcessHandle): number | undefined => targets.get(handle)?.targetPid\n\n/** Native error fields remain data on the public PlatformError cause. */\nconst nativeError = (cause: unknown): Error & { code?: string | undefined; syscall?: string | undefined } => {\n if (cause instanceof Error) return cause\n const value = (cause ?? {}) as Record<string, unknown>\n const text = (field: string): string | undefined => typeof value[field] === \"string\" ? value[field] : undefined\n return new NativeProcessError({\n message: text(\"message\") ?? \"The process supervisor failed\",\n code: text(\"code\"),\n errno: typeof value.errno === \"number\" ? value.errno : undefined,\n reason: text(\"reason\"),\n syscall: text(\"syscall\"),\n path: text(\"path\"),\n signal: text(\"signal\")\n })\n}\n\n/**\n * Preserve the platform's errno and signal vocabulary across the private wire.\n * @private\n * @since 1.0.0\n */\nexport const failure = (method: string, command: string, cause: unknown): PlatformError.PlatformError => {\n const error = nativeError(cause)\n const tags: Readonly<Record<string, PlatformError.SystemErrorTag>> = {\n ENOENT: \"NotFound\",\n EACCES: \"PermissionDenied\",\n EEXIST: \"AlreadyExists\",\n EISDIR: \"BadResource\",\n ENOTDIR: \"BadResource\",\n ELOOP: \"BadResource\",\n EBUSY: \"Busy\"\n }\n return PlatformError.systemError({\n _tag: tags[error.code ?? \"\"] ?? \"Unknown\",\n module: \"ChildProcess\",\n method,\n pathOrDescriptor: command,\n syscall: error.syscall,\n description: error.message,\n cause: error\n })\n}\n\n/**\n * The observation behind an unverified cleanup, in the message itself: a\n * failure report usually shows only the message, and whether the receipt, the\n * kernel or the snapshot was missing decides host load versus a live survivor.\n * @private\n * @since 1.0.0\n */\nexport const unverifiedCleanup = (\n control: {\n readonly fault: unknown\n readonly cleanupFailed: boolean\n readonly cleanupAcknowledged: boolean\n readonly targetDone: boolean\n },\n cleanupRequired: boolean,\n vacant: boolean,\n observed: Snapshot | undefined\n): string =>\n [\n `target exited: ${control.targetDone}`,\n `cleanup receipt: ${\n control.cleanupFailed\n ? \"failed\"\n : !cleanupRequired\n ? \"not required\"\n : control.cleanupAcknowledged\n ? \"acknowledged\"\n : \"missing\"\n }`,\n `group vacant: ${vacant}`,\n observed === undefined\n ? \"group snapshot: unavailable\"\n : `group members: ${\n observed.members.length === 0\n ? \"none\"\n : observed.members.map((member) => `${member.pid} ${member.zombie ? \"zombie\" : \"live\"}`).join(\", \")\n }; host group ${observed.ownGroup}`,\n ...(control.fault === undefined\n ? []\n : [`fault: ${String((control.fault as { message?: unknown })?.message ?? control.fault)}`])\n ].join(\"; \")\n\nconst promise = <A>() => {\n let resolve!: (value: A) => void\n let reject!: (cause: unknown) => void\n const promise = new Promise<A>((yes, no) => {\n resolve = yes\n reject = no\n })\n // A status may arrive before its Effect consumer starts waiting.\n void promise.catch(() => {})\n return { promise, resolve, reject }\n}\n\nconst wait = <A>(value: Promise<A>, method: string, command: string) =>\n Effect.tryPromise({ try: () => value, catch: (cause) => failure(method, command, cause) })\n\nconst bounded = <A, E, R>(effect: Effect.Effect<A, E, R>, millis: number, method: string, command: string) =>\n effect.pipe(\n Effect.timeoutOrElse({\n duration: millis,\n orElse: () =>\n Effect.fail(\n failure(method, command, processFault(\"supervisor_timeout\", `Process supervisor ${method} timed out`))\n )\n }),\n Effect.provideService(Clock.Clock, processClock)\n )\n\n/**\n * Standalone application executables do not implement the runtime's eval CLI.\n * Refuse them before spawning rather than recursively launching the application.\n * @private\n * @since 1.0.0\n */\nexport const bootstrapArguments = (runtime: { readonly bun: boolean; readonly main: string; readonly sea: boolean }) =>\n runtime.sea || runtime.main.startsWith(\"/$bunfs/\")\n ? Effect.fail(\n failure(\n \"spawn\",\n process.execPath,\n processFault(\n \"runtime_unsupported\",\n \"Process supervision requires a Node or Bun runtime executable, not a compiled application\"\n )\n )\n )\n : Effect.succeed(runtime.bun ? [\"--no-env-file\", \"--config=/dev/null\"] : [])\n\nconst channelEnvironment = \"SMITHERS_PROCESS_CHANNEL\"\nconst tlsOptions = { minVersion: \"TLSv1.3\", maxVersion: \"TLSv1.3\", ciphers: \"TLS_AES_128_GCM_SHA256\" } as const\n\n/**\n * Connect an owner to its authenticated private channel.\n * @private\n * @since 1.0.0\n */\nexport const connectOwner = (path: string, environment: Readonly<Record<string, string | undefined>>): Socket => {\n const encoded = environment[channelEnvironment]\n if (encoded === undefined) return createConnection(path)\n const channel = JSON.parse(encoded) as { key: string; status: number; requests: number }\n return Tls.connect({\n ...tlsOptions,\n host: \"127.0.0.1\",\n port: path.endsWith(\"/r\") ? channel.requests : channel.status,\n pskCallback: () => ({ identity: \"smithers-owner\", psk: Buffer.from(channel.key, \"hex\") })\n })\n}\n\n/**\n * Kept separate from Effect scopes so native socket callbacks only settle\n * promises; none can start an unowned fiber or signal an observed process id.\n * @private\n * @since 1.0.0\n */\nexport class Control {\n readonly ready = promise<number>()\n readonly started = promise<void>()\n readonly exited = promise<ExitCode>()\n readonly lost = promise<never>()\n readonly ended = promise<void>()\n readonly requestsReady = promise<void>()\n readonly directory: string\n readonly path: string\n readonly requestPath: string\n readonly server\n readonly requestServer\n readonly listening: Promise<void>\n private readonly key: Buffer | undefined\n private readonly connections = new Set<Socket>()\n socket: Socket | undefined\n requestSocket: Socket | undefined\n targetDone = false\n ownerCreation: unknown\n targetPid: number | undefined\n /** The owner's group guardian: a member that is neither target nor owner. */\n guardianPid: number | undefined\n ownerDone = false\n spawnFailed = false\n cleanupFailed = false\n cleanupAcknowledged = false\n activationSent = false\n closeSent = false\n fault: unknown\n onTargetExit: () => void = () => {}\n onCleanup: () => void = () => {}\n private receivedReady = false\n private receivedStarted = false\n private withdrawn = false\n\n constructor(transport: \"native\" | \"tls\" = \"native\") {\n this.key = transport === \"tls\" || process.platform === \"win32\" ? randomBytes(32) : undefined\n this.directory = mkdtempSync(this.key === undefined ? \"/tmp/sm-p-\" : join(tmpdir(), \"sm-p-\"))\n this.path = `${this.directory}/s`\n this.requestPath = `${this.directory}/r`\n const servers: Array<ReturnType<typeof createServer>> = []\n try {\n chmodSync(this.directory, 0o700)\n this.server = this.makeServer((socket) => this.accept(socket))\n servers.push(this.server)\n this.requestServer = this.makeServer((socket) => this.acceptRequests(socket))\n servers.push(this.requestServer)\n this.listening = Promise.all([\n new Promise<void>((resolve, reject) => {\n this.server.once(\"error\", reject)\n if (this.key === undefined) this.server.listen(this.path, resolve)\n else this.server.listen(0, \"127.0.0.1\", resolve)\n }),\n new Promise<void>((resolve, reject) => {\n this.requestServer.once(\"error\", reject)\n if (this.key === undefined) this.requestServer.listen(this.requestPath, resolve)\n else this.requestServer.listen(0, \"127.0.0.1\", resolve)\n })\n ]).then(() => {})\n } catch (cause) {\n for (const server of servers) server.close()\n rmSync(this.directory, { recursive: true, force: true })\n throw cause\n }\n }\n\n private makeServer(accept: (socket: Socket) => void): ReturnType<typeof createServer> {\n if (this.key === undefined) return createServer(accept)\n const server = Tls.createServer({\n ...tlsOptions,\n handshakeTimeout: startupMs,\n pskCallback: (_socket, identity) => identity === \"smithers-owner\" ? this.key! : null\n }, accept)\n server.on(\"connection\", (socket) => {\n this.connections.add(socket)\n socket.once(\"close\", () => this.connections.delete(socket))\n })\n server.on(\"tlsClientError\", (_error, socket) => socket.destroy())\n return server\n }\n\n /** Only the trusted owner receives this environment; target configuration replaces it. */\n environment(): Readonly<Record<string, string>> {\n if (this.key === undefined) return {}\n const status = this.server.address() as { port: number }\n const requests = this.requestServer.address() as { port: number }\n return {\n [channelEnvironment]: JSON.stringify({\n key: this.key.toString(\"hex\"),\n status: status.port,\n requests: requests.port\n })\n }\n }\n\n /** The test peer uses the same authenticated transport as the isolated owner. */\n connect(requests = false): Socket {\n return connectOwner(requests ? this.requestPath : this.path, this.environment())\n }\n\n /** Validate the stored READY after the raw spawn effect has returned its pid. */\n withdraw(pid: number, actual: number): void {\n if (pid !== actual) throw processFault(\"identity_mismatch\", \"Wrong supervisor identity\")\n this.server.close()\n this.server.unref()\n this.requestServer.close()\n this.requestServer.unref()\n // Node may unlink the owned socket synchronously inside server.close().\n rmSync(this.path, { force: true })\n rmSync(this.requestPath, { force: true })\n rmdirSync(this.directory)\n this.withdrawn = true\n }\n\n /** Request EOF asks for cleanup; leave its independent status reader intact. */\n disconnect(): void {\n this.requestSocket?.destroy()\n }\n\n dispose(): void {\n for (const socket of this.connections) socket.destroy()\n this.disconnect()\n this.socket?.destroy()\n this.server.close()\n this.requestServer.close()\n if (!this.withdrawn) rmSync(this.directory, { recursive: true, force: true })\n }\n\n rawEnded(): void {\n this.ownerDone = true\n // An accepted socket may still have buffered status frames. Its close event\n // rejects missing outcomes only after Node has delivered those frames.\n if (this.socket === undefined) this.closed()\n }\n\n write(message: unknown): Promise<void> {\n return new Promise((resolve, reject) => {\n const socket = this.requestSocket\n if (socket === undefined || socket.destroyed || !socket.writable) {\n reject(processFault(\"control_channel_closed\", \"Private process control channel closed\"))\n return\n }\n const data = `${JSON.stringify(message)}\\n`\n if (Buffer.byteLength(data) > 4 * 1024 * 1024) {\n reject(processFault(\"configuration_too_large\", \"Process configuration exceeds the private frame limit\"))\n return\n }\n socket.write(data, (error) => error ? reject(error) : resolve())\n })\n }\n\n private closed(): void {\n this.disconnect()\n const cause = this.fault ??\n processFault(\"outcome_missing\", \"Process supervisor closed before reporting its outcome\")\n if (this.activationSent && !this.targetDone && !this.spawnFailed) this.lost.reject(cause)\n this.ready.reject(cause)\n this.requestsReady.reject(cause)\n this.started.reject(cause)\n this.exited.reject(cause)\n this.ended.resolve()\n }\n\n private acceptRequests(socket: Socket): void {\n if (this.requestSocket !== undefined) {\n socket.destroy()\n return\n }\n this.requestSocket = socket\n // A late write may fail after the owner has sent its last status frames.\n // Destroying this socket must never discard those frames on the reader.\n socket.on(\"error\", (cause) => {\n this.fault = cause\n })\n this.requestsReady.resolve()\n }\n\n private accept(socket: Socket): void {\n if (this.socket !== undefined) {\n socket.destroy()\n return\n }\n this.socket = socket\n let buffer = \"\"\n socket.setEncoding(\"utf8\")\n socket.on(\"data\", (data: string) => {\n try {\n buffer += data\n if (Buffer.byteLength(buffer) > 16 * 1024) {\n throw processFault(\"status_too_large\", \"Process status frame exceeds its limit\")\n }\n for (;;) {\n const end = buffer.indexOf(\"\\n\")\n if (end < 0) break\n const line = buffer.slice(0, end)\n buffer = buffer.slice(end + 1)\n this.receive(JSON.parse(line))\n }\n } catch (cause) {\n this.fault = cause\n socket.destroy()\n }\n })\n socket.on(\"error\", (cause) => {\n this.fault = cause\n })\n socket.once(\"close\", () => this.closed())\n }\n\n private receive(value: unknown): void {\n if (typeof value !== \"object\" || value === null) throw processFault(\"status_invalid\", \"Invalid process status\")\n const message = value as Record<string, unknown>\n switch (message.type) {\n case \"ready\":\n if (\n this.receivedReady || message.version !== 1 || !Number.isSafeInteger(message.pid) || Number(message.pid) <= 1\n ) {\n throw processFault(\"status_invalid\", \"Invalid process readiness\")\n }\n this.receivedReady = true\n this.ownerCreation = message.created\n this.ready.resolve(Number(message.pid))\n return\n case \"spawned\":\n if (\n !this.activationSent || this.receivedStarted || !Number.isSafeInteger(message.pid) ||\n Number(message.pid) <= 1 ||\n message.guardian !== undefined && (!Number.isSafeInteger(message.guardian) || Number(message.guardian) <= 1)\n ) {\n throw processFault(\"status_invalid\", \"Invalid target startup\")\n }\n this.receivedStarted = true\n this.targetPid = Number(message.pid)\n if (message.guardian !== undefined) this.guardianPid = Number(message.guardian)\n this.started.resolve()\n return\n case \"spawn_error\":\n if (!this.activationSent || this.receivedStarted) {\n throw processFault(\"status_invalid\", \"Invalid target spawn failure\")\n }\n this.spawnFailed = true\n this.fault = message\n this.started.reject(message)\n this.exited.reject(message)\n return\n case \"fault\":\n this.fault = message\n this.started.reject(message)\n this.exited.reject(message)\n return\n case \"exit\":\n if (\n !this.receivedStarted || this.targetDone ||\n !(Number.isInteger(message.code) && Number(message.code) >= 0 && message.signal === null ||\n message.code === null && typeof message.signal === \"string\" && /^SIG[A-Z0-9]+$/.test(message.signal))\n ) {\n throw processFault(\"status_invalid\", \"Invalid target exit status\")\n }\n this.targetDone = true\n if (message.code === null) {\n this.exited.reject({\n message: `Process interrupted due to receipt of signal: '${message.signal}'`,\n signal: message.signal\n })\n } else this.exited.resolve(ExitCode(Number(message.code)))\n this.onTargetExit()\n return\n case \"cleanup_error\":\n this.cleanupFailed = true\n this.fault = message\n return\n case \"cleanup\":\n this.cleanupAcknowledged = true\n this.onCleanup()\n return\n default:\n throw processFault(\"status_unknown\", \"Unknown process status\")\n }\n }\n}\n\n/**\n * Prepare a private, independently bounded process owner before target launch.\n * @private\n * @since 1.0.0\n */\nexport const prepare = (\n system: System,\n policy: (\n options: ChildProcess.KillOptions,\n defaults?: ChildProcess.KillOptions\n ) => Effect.Effect<Policy, PlatformError.PlatformError>,\n transport: \"native\" | \"tls\" = \"native\"\n): Lifecycle =>\n(command, spawn) =>\n Effect.gen(function*() {\n const initial = yield* policy(command.options)\n const bun = process.versions.bun !== undefined\n const sea = bun ? false : (yield* Effect.tryPromise({\n try: () => import(\"node:sea\"),\n catch: (cause) => failure(\"spawn\", process.execPath, cause)\n })).isSea()\n const bootstrap = yield* bootstrapArguments({\n bun,\n sea,\n main: (globalThis as { readonly Bun?: { readonly main?: string } }).Bun?.main ?? \"\"\n })\n const windows = system.platform === \"win32\"\n const grouped = !windows && (command.options.detached ?? true)\n const jobExecutable = windows ?\n yield* Effect.try({\n try: resolveJobExecutable,\n catch: (cause) => failure(\"spawn\", command.command, cause)\n }) :\n undefined\n const control = yield* Effect.acquireRelease(\n Effect.try({ try: () => new Control(transport), catch: (cause) => failure(\"spawn\", command.command, cause) }),\n (control) => Effect.sync(() => control.dispose())\n )\n yield* bounded(wait(control.listening, \"spawn\", command.command), startupMs, \"spawn\", command.command)\n const raw = yield* spawn(ChildProcess.make(process.execPath, [\n ...bootstrap,\n \"-e\",\n source,\n control.path,\n grouped ? \"group\" : \"direct\"\n ], {\n ...command.options,\n cwd: parse(process.execPath).root,\n env: {\n PATH: \"/usr/bin:/bin\",\n HOME: \"/\",\n XDG_CONFIG_HOME: \"/\",\n BUN_RUNTIME_TRANSPILER_CACHE_PATH: \"0\",\n ...control.environment(),\n ...(jobExecutable === undefined ? {} : { SMITHERS_PROCESS_JOB_HELPER: jobExecutable })\n },\n extendEnv: false,\n shell: false,\n detached: grouped,\n killSignal: \"SIGTERM\",\n forceKillAfter: initial.graceMs\n }))\n yield* Effect.exit(raw.exitCode).pipe(Effect.andThen(Effect.sync(() => control.rawEnded())), Effect.forkScoped)\n let job: WindowsProcessJob | undefined\n let settled = false\n let referenced = true\n let reref: Effect.Effect<void, PlatformError.PlatformError> = Effect.void\n let selected = initial\n let requireCleanupReceipt = false\n const snapshot = () => system.snapshot(raw.pid)\n const alone = () => {\n if (!grouped) return control.targetDone\n const observed = snapshot()\n if (observed === undefined || observed.ownGroup === raw.pid) return false\n // The guardian leaves with the owner's final group SIGKILL.\n const running = observed.members.filter((member) => !member.zombie && member.pid !== control.guardianPid)\n return running.length === 1 && running[0]!.pid === raw.pid\n }\n // This observation only shortens the owner's deadline. The live owner makes\n // the signal, so neither a stale observation nor a reused pid grants a kill.\n control.onTargetExit = () => {\n // An explicit stop already owns its deadline and escaped-child sweep.\n // Natural exit must not replace that policy with a second fast stop.\n if (control.closeSent) return\n if (!alone()) return\n control.closeSent = true\n void control.write({ type: \"stop\", killSignal: \"SIGKILL\", fast: true }).catch(() => control.disconnect())\n }\n const finish = yield* Effect.cached(Effect.gen(function*() {\n yield* bounded(Effect.exit(raw.exitCode), selected.graceMs + exitAllowanceMs, \"kill\", command.command).pipe(\n Effect.catch((cause) =>\n job === undefined ? Effect.fail(cause) : Effect.gen(function*() {\n // The native guardian can terminate a stalled owner independently.\n job!.stop()\n yield* bounded(Effect.exit(raw.exitCode), exitAllowanceMs, \"kill\", command.command)\n })\n )\n )\n if (job !== undefined) {\n yield* bounded(wait(job.settled.promise, \"kill\", command.command), 5500, \"kill\", command.command)\n settled = true\n return\n }\n yield* bounded(wait(control.ended.promise, \"kill\", command.command), deliveryMs, \"kill\", command.command).pipe(\n Effect.ignore\n )\n const deadline = Date.now() + verificationMs\n for (;;) {\n // The kernel's ESRCH proves the group empty with no fork. A `ps`\n // snapshot can go unanswered on a loaded host, so it only decides what\n // the kernel cannot: a group still holding zombies, or an unknown one.\n // A live member keeps both answers false. This host is alive, so a\n // vacant group is never this host's own group.\n const vacant = grouped && system.vacant(raw.pid)\n const observed = grouped && !vacant ? snapshot() : undefined\n settled = !control.cleanupFailed && (!requireCleanupReceipt || control.cleanupAcknowledged) && (grouped\n ? vacant ||\n observed !== undefined && observed.ownGroup !== raw.pid && observed.members.every((member) => member.zombie)\n : control.targetDone || control.spawnFailed || !control.activationSent)\n if (settled) return\n if (Date.now() >= deadline) {\n return yield* Effect.fail(\n failure(\n \"kill\",\n command.command,\n processFault(\n \"cleanup_unverified\",\n \"Process cleanup could not be verified; its ledger record is retained \" +\n `(${unverifiedCleanup(control, requireCleanupReceipt, vacant, observed)})`,\n {\n cause: {\n fault: control.fault,\n cleanupFailed: control.cleanupFailed,\n cleanupRequired: requireCleanupReceipt,\n cleanupAcknowledged: control.cleanupAcknowledged,\n targetDone: control.targetDone,\n groupVacant: vacant,\n ownerObserved: observed !== undefined,\n members: observed?.members\n }\n }\n )\n )\n )\n }\n yield* Effect.sleep(10).pipe(Effect.provideService(Clock.Clock, processClock))\n }\n }))\n const kill = (options: ChildProcess.KillOptions = {}) =>\n Effect.gen(function*() {\n const requested = yield* policy(options, command.options)\n if (!referenced) {\n job?.reference(true)\n control.socket?.ref()\n control.requestSocket?.ref()\n yield* reref\n referenced = true\n }\n if (!control.closeSent) {\n control.closeSent = true\n selected = requested\n // An empty original group cannot prove an explicit escaped-descendant\n // sweep succeeded if its status frames were lost. Startup and natural\n // completion have no such additional contract.\n requireCleanupReceipt = grouped && control.activationSent && !control.spawnFailed && !control.targetDone\n yield* bounded(\n wait(\n control.write({\n type: \"stop\",\n explicit: true,\n ...requested,\n // A live target can move out of this group with setsid().\n // Only an owner whose target was never activated can replace\n // the requested signal; natural exit has its own fast path.\n killSignal: !control.activationSent && alone() ? \"SIGKILL\" : requested.killSignal\n }),\n \"kill\",\n command.command\n ),\n deliveryMs,\n \"kill\",\n command.command\n )\n .pipe(Effect.catch(() => Effect.sync(() => control.disconnect())))\n }\n yield* finish\n }).pipe(Effect.uninterruptible)\n yield* Effect.addFinalizer(() =>\n kill().pipe(\n // A stuck owner keeps its ledger entry. Disable the underlying spawner's\n // unconditional group-kill finalizer rather than signal a stale identity.\n Effect.ensuring(\n Effect.suspend(() =>\n settled ? Effect.void : Effect.andThen(\n raw.unref,\n Effect.sync(() => {\n job?.stop()\n job?.reference(false)\n control.disconnect()\n })\n )\n ).pipe(Effect.orDie)\n ),\n Effect.orDie\n )\n )\n const ready = yield* bounded(\n wait(control.ready.promise, \"spawn\", command.command),\n startupMs,\n \"spawn\",\n command.command\n )\n yield* bounded(wait(control.requestsReady.promise, \"spawn\", command.command), startupMs, \"spawn\", command.command)\n yield* Effect.try({\n try: () => control.withdraw(ready, raw.pid),\n catch: (cause) => failure(\"spawn\", command.command, cause)\n })\n if (windows) {\n job = yield* Effect.try({\n try: () => new WindowsProcessJob(raw.pid, control.ownerCreation, jobExecutable!),\n catch: (cause) => failure(\"spawn\", command.command, cause)\n })\n yield* bounded(wait(job.ready.promise, \"spawn\", command.command), startupMs, \"spawn\", command.command)\n }\n const acknowledgeCleanup = windows || transport === \"tls\"\n if (acknowledgeCleanup) {\n control.onCleanup = () => {\n if (!control.ownerDone) {\n void control.write({ type: \"cleanup_ack\" }).catch(() => control.disconnect())\n }\n }\n }\n const options = command.options\n // Match Effect/Node's undefined-vs-empty environment semantics in the host,\n // before replacing the helper's environment with its isolated bootstrap.\n const env = options.extendEnv ? { ...process.env, ...options.env } : options.env ?? { ...process.env }\n yield* bounded(\n wait(\n control.write({\n type: \"configure\",\n acknowledgeCleanup,\n command: command.command,\n args: command.args,\n cwd: resolve(options.cwd ?? process.cwd()),\n env,\n shell: options.shell,\n windowsHide: options.windowsHide ?? true,\n windowsVerbatimArguments:\n (options as ChildProcess.CommandOptions & { readonly windowsVerbatimArguments?: boolean })\n .windowsVerbatimArguments,\n standardFds: standardFdsOf(raw),\n userFds: [\n ...new Set(\n Object.keys(options.additionalFds ?? {}).map(ChildProcess.parseFdName)\n .filter((fd): fd is number => fd !== undefined)\n )\n ],\n ...initial\n }),\n \"spawn\",\n command.command\n ),\n deliveryMs,\n \"spawn\",\n command.command\n )\n const activate = yield* Effect.cached(Effect.gen(function*() {\n control.activationSent = true\n yield* bounded(\n wait(control.write({ type: \"start\" }), \"spawn\", command.command),\n deliveryMs,\n \"spawn\",\n command.command\n )\n yield* bounded(wait(control.started.promise, \"spawn\", command.command), startupMs, \"spawn\", command.command)\n }))\n const unref = Effect.gen(function*() {\n if (referenced) {\n reref = yield* raw.unref\n job?.reference(false)\n control.socket?.unref()\n control.requestSocket?.unref()\n referenced = false\n }\n return Effect.gen(function*() {\n if (!referenced) {\n job?.reference(true)\n control.socket?.ref()\n control.requestSocket?.ref()\n yield* reref\n referenced = true\n }\n })\n })\n const output = <A>(stream: Stream.Stream<A, PlatformError.PlatformError>) =>\n stream.pipe(\n Stream.interruptWhen(wait(control.lost.promise, \"read\", command.command))\n )\n const input = <A>(sink: Sink.Sink<A, Uint8Array, never, PlatformError.PlatformError>) =>\n Sink.fromChannel(\n Sink.toChannel(sink).pipe(Channel.interruptWhen(wait(control.lost.promise, \"write\", command.command)))\n )\n const handle = makeHandle({\n ...raw,\n exitCode: wait(control.exited.promise, \"exitCode\", command.command),\n isRunning: Effect.sync(() => !control.targetDone && !control.ownerDone),\n stdin: input(raw.stdin),\n getInputFd: (fd) => input(raw.getInputFd(fd)),\n stdout: output(raw.stdout),\n stderr: output(raw.stderr),\n all: output(raw.all),\n getOutputFd: (fd) => output(raw.getOutputFd(fd)),\n kill,\n unref\n })\n targets.set(handle, control)\n return {\n handle,\n activate,\n settled: Effect.sync(() => settled)\n }\n })\n"]}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * The isolated POSIX group owner. Kept as source because the same fixed program
3
+ * runs in Node and Bun without loading the caller's modules or configuration.
4
+ * Its behavior is exercised through the real prepared lifecycle tests.
5
+ * @private
6
+ * @since 1.0.0
7
+ */
8
+ export declare const source: string;
9
+ //# sourceMappingURL=SupervisorProgram.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SupervisorProgram.d.ts","sourceRoot":"","sources":["../../../src/internal/SupervisorProgram.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,eAAO,MAAM,MAAM,QA6SlB,CAAA"}
@@ -0,0 +1,310 @@
1
+ /**
2
+ * The isolated POSIX group owner. Kept as source because the same fixed program
3
+ * runs in Node and Bun without loading the caller's modules or configuration.
4
+ * Its behavior is exercised through the real prepared lifecycle tests.
5
+ * @private
6
+ * @since 1.0.0
7
+ */
8
+ export const source = String.raw `
9
+ // A fault of the owner itself: reason is its stable code on the status wire.
10
+ class SupervisorFault extends Error {
11
+ constructor(reason, message) { super(message); this.name = 'SupervisorFault'; this.reason = reason; }
12
+ }
13
+ const fs = require('node:fs');
14
+ const net = require('node:net');
15
+ const cp = require('node:child_process');
16
+ const [socketPath, mode] = process.argv.slice(-2);
17
+ const grouped = mode === 'group';
18
+ const jobHelper = process.env.SMITHERS_PROCESS_JOB_HELPER;
19
+ delete process.env.SMITHERS_PROCESS_JOB_HELPER;
20
+ let created;
21
+ if (jobHelper !== undefined) {
22
+ // The still-live owner observes itself. A later PID reuse cannot replace this
23
+ // identity with a different process before the guardian attaches its job.
24
+ const result = cp.spawnSync(jobHelper, ['--process-identity', String(process.pid)], {
25
+ encoding: 'utf8', timeout: 5000, killSignal: 'SIGKILL', maxBuffer: 4096, env: {}
26
+ });
27
+ if (result.error || result.signal !== null || result.status !== 0) throw new SupervisorFault('owner_identity_unavailable', 'Owner identity unavailable');
28
+ const identity = JSON.parse(result.stdout);
29
+ if (identity?.status !== 'started' || typeof identity.created !== 'string' || !/^[1-9][0-9]{0,19}$/.test(identity.created)) {
30
+ throw new SupervisorFault('owner_identity_unavailable', 'Owner creation identity unavailable');
31
+ }
32
+ created = identity.created;
33
+ }
34
+ const channel = process.env.SMITHERS_PROCESS_CHANNEL ? JSON.parse(process.env.SMITHERS_PROCESS_CHANNEL) : undefined;
35
+ delete process.env.SMITHERS_PROCESS_CHANNEL;
36
+ const connect = path => channel === undefined ? net.connect(path) : require('node:tls').connect({
37
+ minVersion: 'TLSv1.3', maxVersion: 'TLSv1.3', ciphers: 'TLS_AES_128_GCM_SHA256',
38
+ host: '127.0.0.1', port: path.endsWith('/r') ? channel.requests : channel.status,
39
+ pskCallback: () => ({ identity: 'smithers-owner', psk: Buffer.from(channel.key, 'hex') })
40
+ });
41
+ const control = connect(socketPath);
42
+ // A request write racing our exit may get EPIPE. Keep status on its own
43
+ // connection so the host still receives the exit and cleanup already sent.
44
+ const requests = connect(socketPath.replace(/\/s$/, '/r'));
45
+ let config;
46
+ let target;
47
+ // An owner killed outright (SIGKILL, the OOM killer) runs no handler, so it
48
+ // cannot stop its group. Its guardian is a member of that group that waits on
49
+ // a pipe only the owner holds. At EOF it kills its own group: kill 0 names the
50
+ // caller's group, never a number that could be stale. It ignores the catchable
51
+ // signals a stop sends the group and dies in the owner's final SIGKILL.
52
+ let guardian;
53
+ const guardianScript = "command trap '' HUP INT QUIT ABRT ALRM TERM USR1 USR2 PIPE TSTP TTIN TTOU; read -r line; kill -s KILL 0";
54
+ let targetDone = false;
55
+ let stopping = false;
56
+ let explicitStop = false;
57
+ let killing = false;
58
+ let buffer = '';
59
+ let timer;
60
+ let escaped = new Map();
61
+
62
+ // DirectorySandbox's trusted local explicit-stop contract also covers children
63
+ // that deliberately create another session. This is best-effort positive-pid
64
+ // signalling with identity revalidation, not the atomic own-group guarantee.
65
+ // Linux reads its kernel table because slim images ship no procps (and BusyBox
66
+ // ps lacks these columns); other POSIX hosts ask their system ps.
67
+ const procSnapshot = () => {
68
+ let names;
69
+ try { names = fs.readdirSync('/proc'); }
70
+ catch { throw new SupervisorFault('descendant_observation_unavailable', 'Descendant observation unavailable'); }
71
+ const rows = new Map();
72
+ for (const name of names) {
73
+ if (!/^[0-9]+$/.test(name)) continue;
74
+ let text;
75
+ try { text = fs.readFileSync('/proc/' + name + '/stat', 'utf8'); }
76
+ catch (error) {
77
+ // A process that ended after the listing is not an unreadable table.
78
+ if (error.code === 'ENOENT' || error.code === 'ESRCH') continue;
79
+ throw new SupervisorFault('descendant_observation_unavailable', 'Descendant observation unavailable');
80
+ }
81
+ // comm may contain spaces and parentheses; fields follow its last paren.
82
+ const close = text.lastIndexOf(')');
83
+ const head = text.slice(0, text.indexOf('(')).trim();
84
+ const fields = text.slice(close + 1).trim().split(/[ \t]+/);
85
+ if (close < 0 || head !== name || fields.length < 20) throw new SupervisorFault('descendant_observation_invalid', 'Invalid descendant observation');
86
+ // Fields 4, 5 and 22: parent, group and start time in clock ticks since boot.
87
+ const [pid, parent, group, start] = [head, fields[1], fields[2], fields[19]].map(Number);
88
+ if (![pid, parent, group, start].every(Number.isSafeInteger)) throw new SupervisorFault('descendant_identity_invalid', 'Invalid descendant identity');
89
+ rows.set(pid, { pid, parent, group, start, zombie: fields[0] === 'Z' });
90
+ }
91
+ return rows;
92
+ };
93
+ const psSnapshot = () => {
94
+ const result = cp.spawnSync('/bin/ps', ['-A', '-o', 'pid=,ppid=,pgid=,stat=,lstart='], {
95
+ encoding: 'utf8', timeout: 500, killSignal: 'SIGKILL', maxBuffer: 4 * 1024 * 1024,
96
+ env: { PATH: '/usr/bin:/bin', LC_ALL: 'C' }
97
+ });
98
+ if (result.error || result.status !== 0) throw new SupervisorFault('descendant_observation_unavailable', 'Descendant observation unavailable');
99
+ const rows = new Map();
100
+ for (const line of result.stdout.trim().split('\n')) {
101
+ const match = /^\s*(\d+)\s+(\d+)\s+(\d+)\s+(\S+)\s+(.+)$/.exec(line);
102
+ if (!match) throw new SupervisorFault('descendant_observation_invalid', 'Invalid descendant observation');
103
+ const [pid, parent, group] = match.slice(1, 4).map(Number);
104
+ const start = Date.parse(match[5]);
105
+ if (![pid, parent, group, start].every(Number.isSafeInteger)) throw new SupervisorFault('descendant_identity_invalid', 'Invalid descendant identity');
106
+ rows.set(pid, { pid, parent, group, start, zombie: match[4].startsWith('Z') });
107
+ }
108
+ return rows;
109
+ };
110
+ const snapshot = process.platform === 'linux' ? procSnapshot : psSnapshot;
111
+ const captureEscaped = () => {
112
+ const rows = snapshot();
113
+ const descendants = new Set([target.pid]);
114
+ for (;;) {
115
+ const previous = descendants.size;
116
+ for (const row of rows.values()) if (descendants.has(row.parent)) descendants.add(row.pid);
117
+ if (descendants.size === previous) break;
118
+ }
119
+ for (const pid of descendants) {
120
+ const row = rows.get(pid);
121
+ if (row && !row.zombie && row.group !== process.pid && pid !== process.pid && pid > 1) escaped.set(pid, row);
122
+ }
123
+ };
124
+ const signalEscaped = (signal) => {
125
+ if (escaped.size === 0) return;
126
+ const rows = snapshot();
127
+ for (const [pid, recorded] of escaped) {
128
+ const row = rows.get(pid);
129
+ if (!row || row.zombie) { escaped.delete(pid); continue; }
130
+ if (row.start !== recorded.start || row.group !== recorded.group) {
131
+ throw new SupervisorFault('descendant_identity_changed', 'Escaped descendant identity changed before signalling');
132
+ }
133
+ try { process.kill(pid, signal); }
134
+ catch (error) { if (error.code === 'ESRCH') escaped.delete(pid); else throw error; }
135
+ }
136
+ };
137
+ const cleanupError = (error) => send({ type: 'cleanup_error', reason: error.reason, message: String(error.message).slice(0, 2048) });
138
+ const escapedSettled = () => {
139
+ if (escaped.size === 0) return true;
140
+ const rows = snapshot();
141
+ for (const [pid, recorded] of escaped) {
142
+ const row = rows.get(pid);
143
+ if (!row || row.zombie) { escaped.delete(pid); continue; }
144
+ if (row.start !== recorded.start || row.group !== recorded.group) {
145
+ throw new SupervisorFault('descendant_identity_changed', 'Escaped descendant identity changed before cleanup verification');
146
+ }
147
+ }
148
+ return escaped.size === 0;
149
+ };
150
+
151
+ const send = (message, done = () => {}) => {
152
+ if (control.destroyed || !control.writable) return done();
153
+ control.write(JSON.stringify(message) + '\n', done);
154
+ };
155
+ const selfKill = () => process.kill(grouped ? -process.pid : process.pid, 'SIGKILL');
156
+ const force = () => {
157
+ if (killing) return;
158
+ killing = true;
159
+ if (!grouped && target?.pid !== undefined && !targetDone) {
160
+ target.kill('SIGKILL');
161
+ return;
162
+ }
163
+ try { signalEscaped('SIGKILL'); } catch (error) { cleanupError(error); }
164
+ const deadline = Date.now() + 500;
165
+ const complete = () => {
166
+ try {
167
+ if (!escapedSettled()) {
168
+ if (Date.now() < deadline) { setTimeout(complete, 10); return; }
169
+ throw new SupervisorFault('descendants_unsettled', 'Escaped descendants did not settle before the cleanup bound');
170
+ }
171
+ } catch (error) { cleanupError(error); }
172
+ // TLS write completion does not prove the peer received terminal status.
173
+ // Keep the owner alive for its receipt; an unresponsive host still cannot
174
+ // delay cleanup beyond the existing delivery bound.
175
+ setTimeout(selfKill, 100);
176
+ send({ type: 'cleanup' }, config?.acknowledgeCleanup ? () => {} : selfKill);
177
+ };
178
+ complete();
179
+ };
180
+ const stop = (options = {}) => {
181
+ // The first explicit stop owns its signal and deadline, including after EOF
182
+ // or target exit. Only natural cleanup can accept the host's fast shortcut.
183
+ if (stopping && (explicitStop || !options.fast)) return;
184
+ const signal = options.killSignal ?? config?.killSignal ?? 'SIGTERM';
185
+ // A target's exit cannot shorten a captured escaped child's grace period.
186
+ if (options.fast && escaped.size !== 0) return;
187
+ // A grouped owner reaches its members with one group signal and captures
188
+ // only children that left the group. A direct target shares the host's
189
+ // group, so every descendant is captured and signalled by pid.
190
+ if (options.explicit && !targetDone && target?.pid !== undefined) {
191
+ try { captureEscaped(); } catch (error) { cleanupError(error); }
192
+ }
193
+ stopping = true;
194
+ explicitStop = options.explicit === true;
195
+ if (signal === 'SIGKILL' || target?.pid === undefined || (!grouped && targetDone)) return force();
196
+ if (signal === 'SIGSTOP') return force();
197
+ // Keep the group owner alive to enforce escalation, including when the caller
198
+ // chooses a catchable signal other than TERM/INT. SIGSTOP is refused by host.
199
+ process.on(signal, () => {});
200
+ try { signalEscaped(signal); } catch (error) { cleanupError(error); }
201
+ if (grouped) process.kill(-process.pid, signal);
202
+ else target.kill(signal);
203
+ timer = setTimeout(force, options.graceMs ?? config?.graceMs ?? 2000);
204
+ };
205
+ // The grace window exists for the group's remaining members. Once the target
206
+ // has exited and a snapshot shows no other live member and no escaped child,
207
+ // nobody is left to wait for: finish now instead of sleeping out the grace.
208
+ // An unreadable table keeps the deadline.
209
+ const settleVacantGroup = () => {
210
+ if (!stopping || killing || escaped.size !== 0) return;
211
+ let rows;
212
+ try { rows = snapshot(); } catch { return; }
213
+ for (const row of rows.values()) {
214
+ // The owner's other children are its guardian and the ps answering this
215
+ // snapshot; the exited target is already reaped and its orphans have
216
+ // another parent.
217
+ if (row.group === process.pid && row.pid !== process.pid && row.parent !== process.pid && !row.zombie) return;
218
+ }
219
+ clearTimeout(timer);
220
+ force();
221
+ };
222
+ const spawnError = (error) => {
223
+ send({ type: 'spawn_error', code: error.code, errno: error.errno,
224
+ syscall: error.syscall, path: error.path, message: String(error.message).slice(0, 2048) });
225
+ stop();
226
+ };
227
+ process.on('SIGTERM', () => { if (!stopping) stop(); });
228
+ process.on('SIGINT', () => { if (!stopping) stop(); });
229
+ process.on('uncaughtException', (error) => {
230
+ try { send({ type: 'fault', reason: error.reason, message: String(error.message).slice(0, 2048) }, force); }
231
+ finally { force(); }
232
+ });
233
+ process.on('unhandledRejection', (error) => { throw error; });
234
+ control.on('end', () => stop({ explicit: true }));
235
+ control.on('error', () => stop({ explicit: true }));
236
+ requests.on('end', () => stop({ explicit: true }));
237
+ requests.on('error', () => stop({ explicit: true }));
238
+ requests.setEncoding('utf8');
239
+ requests.on('data', (data) => {
240
+ buffer += data;
241
+ if (Buffer.byteLength(buffer) > 4 * 1024 * 1024) throw new SupervisorFault('control_frame_too_large', 'Control frame too large');
242
+ for (;;) {
243
+ const end = buffer.indexOf('\n');
244
+ if (end < 0) break;
245
+ const line = buffer.slice(0, end);
246
+ buffer = buffer.slice(end + 1);
247
+ const message = JSON.parse(line);
248
+ if (message.type === 'configure') {
249
+ if (config !== undefined || stopping) throw new SupervisorFault('configuration_invalid', 'Duplicate or late configuration');
250
+ config = message;
251
+ } else if (message.type === 'cleanup_ack') {
252
+ if (!config?.acknowledgeCleanup || !killing) throw new SupervisorFault('cleanup_acknowledgment_unexpected', 'Unexpected cleanup acknowledgment');
253
+ selfKill();
254
+ } else if (message.type === 'stop') stop(message);
255
+ else if (message.type === 'start') {
256
+ if (config === undefined || target !== undefined || stopping) throw new SupervisorFault('activation_invalid', 'Invalid activation');
257
+ const descriptors = Array.from({ length: Math.max(2, ...config.userFds) + 1 }, () => 'ignore');
258
+ for (const fd of [0, 1, 2, ...config.userFds]) descriptors[fd] = fd;
259
+ if (config.standardFds !== undefined) {
260
+ for (const fd of [0, 1, 2]) descriptors[fd] = config.standardFds[fd];
261
+ }
262
+ if (grouped) {
263
+ // Started before the target, so no target outlives an owner unguarded.
264
+ // Every caller descriptor slot is replaced: a guardian holding a copy
265
+ // of the caller's output would keep that pipe from reaching EOF.
266
+ const guarded = descriptors.map(() => 'ignore');
267
+ guarded[0] = 'pipe';
268
+ guardian = cp.spawn('/bin/sh', ['-c', guardianScript], { cwd: '/', env: {}, detached: false, stdio: guarded });
269
+ // A failed launch has no pid; its later error event is the same fault.
270
+ guardian.once('error', () => {});
271
+ if (guardian.pid === undefined) throw new SupervisorFault('guardian_unavailable', 'Process group guardian unavailable');
272
+ guardian.stdin.on('error', () => {});
273
+ }
274
+ try {
275
+ target = cp.spawn(config.command, config.args, {
276
+ cwd: config.cwd, env: config.env, shell: config.shell,
277
+ windowsHide: config.windowsHide, windowsVerbatimArguments: config.windowsVerbatimArguments,
278
+ detached: false, stdio: descriptors
279
+ });
280
+ } catch (error) { spawnError(error); continue; }
281
+ target.once('spawn', () => {
282
+ // Release every caller pipe copy. Keep the runtime's standard slots
283
+ // valid so a later internal allocation cannot reuse a closed 0/1/2.
284
+ if (config.standardFds !== undefined) {
285
+ // libuv intentionally does not close Windows CRT descriptors 0..2.
286
+ // Caller pipes arrive in separate slots; the reserved slots are NUL.
287
+ for (const fd of config.standardFds) if (fd !== 'ignore') fs.closeSync(fd);
288
+ } else {
289
+ for (const fd of [0, 1, 2]) {
290
+ fs.closeSync(fd);
291
+ const replacement = fs.openSync(require('node:os').devNull, fd === 0 ? 'r' : 'w');
292
+ if (replacement !== fd) throw new SupervisorFault('stream_detach_failed', 'Could not detach supervisor standard streams');
293
+ }
294
+ }
295
+ for (const fd of config.userFds) fs.closeSync(fd);
296
+ send({ type: 'spawned', pid: target.pid, ...(guardian === undefined ? {} : { guardian: guardian.pid }) });
297
+ });
298
+ target.once('error', spawnError);
299
+ target.once('exit', (code, signal) => {
300
+ targetDone = true;
301
+ send({ type: 'exit', code, signal });
302
+ if (grouped) { stop(); settleVacantGroup(); }
303
+ else { killing = false; clearTimeout(timer); force(); }
304
+ });
305
+ } else throw new SupervisorFault('control_message_invalid', 'Invalid control message');
306
+ }
307
+ });
308
+ control.once('connect', () => send({ type: 'ready', version: 1, pid: process.pid, created }));
309
+ `;
310
+ //# sourceMappingURL=SupervisorProgram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SupervisorProgram.js","sourceRoot":"","sources":["../../../src/internal/SupervisorProgram.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6S/B,CAAA","sourcesContent":["/**\n * The isolated POSIX group owner. Kept as source because the same fixed program\n * runs in Node and Bun without loading the caller's modules or configuration.\n * Its behavior is exercised through the real prepared lifecycle tests.\n * @private\n * @since 1.0.0\n */\nexport const source = String.raw`\n// A fault of the owner itself: reason is its stable code on the status wire.\nclass SupervisorFault extends Error {\n constructor(reason, message) { super(message); this.name = 'SupervisorFault'; this.reason = reason; }\n}\nconst fs = require('node:fs');\nconst net = require('node:net');\nconst cp = require('node:child_process');\nconst [socketPath, mode] = process.argv.slice(-2);\nconst grouped = mode === 'group';\nconst jobHelper = process.env.SMITHERS_PROCESS_JOB_HELPER;\ndelete process.env.SMITHERS_PROCESS_JOB_HELPER;\nlet created;\nif (jobHelper !== undefined) {\n // The still-live owner observes itself. A later PID reuse cannot replace this\n // identity with a different process before the guardian attaches its job.\n const result = cp.spawnSync(jobHelper, ['--process-identity', String(process.pid)], {\n encoding: 'utf8', timeout: 5000, killSignal: 'SIGKILL', maxBuffer: 4096, env: {}\n });\n if (result.error || result.signal !== null || result.status !== 0) throw new SupervisorFault('owner_identity_unavailable', 'Owner identity unavailable');\n const identity = JSON.parse(result.stdout);\n if (identity?.status !== 'started' || typeof identity.created !== 'string' || !/^[1-9][0-9]{0,19}$/.test(identity.created)) {\n throw new SupervisorFault('owner_identity_unavailable', 'Owner creation identity unavailable');\n }\n created = identity.created;\n}\nconst channel = process.env.SMITHERS_PROCESS_CHANNEL ? JSON.parse(process.env.SMITHERS_PROCESS_CHANNEL) : undefined;\ndelete process.env.SMITHERS_PROCESS_CHANNEL;\nconst connect = path => channel === undefined ? net.connect(path) : require('node:tls').connect({\n minVersion: 'TLSv1.3', maxVersion: 'TLSv1.3', ciphers: 'TLS_AES_128_GCM_SHA256',\n host: '127.0.0.1', port: path.endsWith('/r') ? channel.requests : channel.status,\n pskCallback: () => ({ identity: 'smithers-owner', psk: Buffer.from(channel.key, 'hex') })\n});\nconst control = connect(socketPath);\n// A request write racing our exit may get EPIPE. Keep status on its own\n// connection so the host still receives the exit and cleanup already sent.\nconst requests = connect(socketPath.replace(/\\/s$/, '/r'));\nlet config;\nlet target;\n// An owner killed outright (SIGKILL, the OOM killer) runs no handler, so it\n// cannot stop its group. Its guardian is a member of that group that waits on\n// a pipe only the owner holds. At EOF it kills its own group: kill 0 names the\n// caller's group, never a number that could be stale. It ignores the catchable\n// signals a stop sends the group and dies in the owner's final SIGKILL.\nlet guardian;\nconst guardianScript = \"command trap '' HUP INT QUIT ABRT ALRM TERM USR1 USR2 PIPE TSTP TTIN TTOU; read -r line; kill -s KILL 0\";\nlet targetDone = false;\nlet stopping = false;\nlet explicitStop = false;\nlet killing = false;\nlet buffer = '';\nlet timer;\nlet escaped = new Map();\n\n// DirectorySandbox's trusted local explicit-stop contract also covers children\n// that deliberately create another session. This is best-effort positive-pid\n// signalling with identity revalidation, not the atomic own-group guarantee.\n// Linux reads its kernel table because slim images ship no procps (and BusyBox\n// ps lacks these columns); other POSIX hosts ask their system ps.\nconst procSnapshot = () => {\n let names;\n try { names = fs.readdirSync('/proc'); }\n catch { throw new SupervisorFault('descendant_observation_unavailable', 'Descendant observation unavailable'); }\n const rows = new Map();\n for (const name of names) {\n if (!/^[0-9]+$/.test(name)) continue;\n let text;\n try { text = fs.readFileSync('/proc/' + name + '/stat', 'utf8'); }\n catch (error) {\n // A process that ended after the listing is not an unreadable table.\n if (error.code === 'ENOENT' || error.code === 'ESRCH') continue;\n throw new SupervisorFault('descendant_observation_unavailable', 'Descendant observation unavailable');\n }\n // comm may contain spaces and parentheses; fields follow its last paren.\n const close = text.lastIndexOf(')');\n const head = text.slice(0, text.indexOf('(')).trim();\n const fields = text.slice(close + 1).trim().split(/[ \\t]+/);\n if (close < 0 || head !== name || fields.length < 20) throw new SupervisorFault('descendant_observation_invalid', 'Invalid descendant observation');\n // Fields 4, 5 and 22: parent, group and start time in clock ticks since boot.\n const [pid, parent, group, start] = [head, fields[1], fields[2], fields[19]].map(Number);\n if (![pid, parent, group, start].every(Number.isSafeInteger)) throw new SupervisorFault('descendant_identity_invalid', 'Invalid descendant identity');\n rows.set(pid, { pid, parent, group, start, zombie: fields[0] === 'Z' });\n }\n return rows;\n};\nconst psSnapshot = () => {\n const result = cp.spawnSync('/bin/ps', ['-A', '-o', 'pid=,ppid=,pgid=,stat=,lstart='], {\n encoding: 'utf8', timeout: 500, killSignal: 'SIGKILL', maxBuffer: 4 * 1024 * 1024,\n env: { PATH: '/usr/bin:/bin', LC_ALL: 'C' }\n });\n if (result.error || result.status !== 0) throw new SupervisorFault('descendant_observation_unavailable', 'Descendant observation unavailable');\n const rows = new Map();\n for (const line of result.stdout.trim().split('\\n')) {\n const match = /^\\s*(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\S+)\\s+(.+)$/.exec(line);\n if (!match) throw new SupervisorFault('descendant_observation_invalid', 'Invalid descendant observation');\n const [pid, parent, group] = match.slice(1, 4).map(Number);\n const start = Date.parse(match[5]);\n if (![pid, parent, group, start].every(Number.isSafeInteger)) throw new SupervisorFault('descendant_identity_invalid', 'Invalid descendant identity');\n rows.set(pid, { pid, parent, group, start, zombie: match[4].startsWith('Z') });\n }\n return rows;\n};\nconst snapshot = process.platform === 'linux' ? procSnapshot : psSnapshot;\nconst captureEscaped = () => {\n const rows = snapshot();\n const descendants = new Set([target.pid]);\n for (;;) {\n const previous = descendants.size;\n for (const row of rows.values()) if (descendants.has(row.parent)) descendants.add(row.pid);\n if (descendants.size === previous) break;\n }\n for (const pid of descendants) {\n const row = rows.get(pid);\n if (row && !row.zombie && row.group !== process.pid && pid !== process.pid && pid > 1) escaped.set(pid, row);\n }\n};\nconst signalEscaped = (signal) => {\n if (escaped.size === 0) return;\n const rows = snapshot();\n for (const [pid, recorded] of escaped) {\n const row = rows.get(pid);\n if (!row || row.zombie) { escaped.delete(pid); continue; }\n if (row.start !== recorded.start || row.group !== recorded.group) {\n throw new SupervisorFault('descendant_identity_changed', 'Escaped descendant identity changed before signalling');\n }\n try { process.kill(pid, signal); }\n catch (error) { if (error.code === 'ESRCH') escaped.delete(pid); else throw error; }\n }\n};\nconst cleanupError = (error) => send({ type: 'cleanup_error', reason: error.reason, message: String(error.message).slice(0, 2048) });\nconst escapedSettled = () => {\n if (escaped.size === 0) return true;\n const rows = snapshot();\n for (const [pid, recorded] of escaped) {\n const row = rows.get(pid);\n if (!row || row.zombie) { escaped.delete(pid); continue; }\n if (row.start !== recorded.start || row.group !== recorded.group) {\n throw new SupervisorFault('descendant_identity_changed', 'Escaped descendant identity changed before cleanup verification');\n }\n }\n return escaped.size === 0;\n};\n\nconst send = (message, done = () => {}) => {\n if (control.destroyed || !control.writable) return done();\n control.write(JSON.stringify(message) + '\\n', done);\n};\nconst selfKill = () => process.kill(grouped ? -process.pid : process.pid, 'SIGKILL');\nconst force = () => {\n if (killing) return;\n killing = true;\n if (!grouped && target?.pid !== undefined && !targetDone) {\n target.kill('SIGKILL');\n return;\n }\n try { signalEscaped('SIGKILL'); } catch (error) { cleanupError(error); }\n const deadline = Date.now() + 500;\n const complete = () => {\n try {\n if (!escapedSettled()) {\n if (Date.now() < deadline) { setTimeout(complete, 10); return; }\n throw new SupervisorFault('descendants_unsettled', 'Escaped descendants did not settle before the cleanup bound');\n }\n } catch (error) { cleanupError(error); }\n // TLS write completion does not prove the peer received terminal status.\n // Keep the owner alive for its receipt; an unresponsive host still cannot\n // delay cleanup beyond the existing delivery bound.\n setTimeout(selfKill, 100);\n send({ type: 'cleanup' }, config?.acknowledgeCleanup ? () => {} : selfKill);\n };\n complete();\n};\nconst stop = (options = {}) => {\n // The first explicit stop owns its signal and deadline, including after EOF\n // or target exit. Only natural cleanup can accept the host's fast shortcut.\n if (stopping && (explicitStop || !options.fast)) return;\n const signal = options.killSignal ?? config?.killSignal ?? 'SIGTERM';\n // A target's exit cannot shorten a captured escaped child's grace period.\n if (options.fast && escaped.size !== 0) return;\n // A grouped owner reaches its members with one group signal and captures\n // only children that left the group. A direct target shares the host's\n // group, so every descendant is captured and signalled by pid.\n if (options.explicit && !targetDone && target?.pid !== undefined) {\n try { captureEscaped(); } catch (error) { cleanupError(error); }\n }\n stopping = true;\n explicitStop = options.explicit === true;\n if (signal === 'SIGKILL' || target?.pid === undefined || (!grouped && targetDone)) return force();\n if (signal === 'SIGSTOP') return force();\n // Keep the group owner alive to enforce escalation, including when the caller\n // chooses a catchable signal other than TERM/INT. SIGSTOP is refused by host.\n process.on(signal, () => {});\n try { signalEscaped(signal); } catch (error) { cleanupError(error); }\n if (grouped) process.kill(-process.pid, signal);\n else target.kill(signal);\n timer = setTimeout(force, options.graceMs ?? config?.graceMs ?? 2000);\n};\n// The grace window exists for the group's remaining members. Once the target\n// has exited and a snapshot shows no other live member and no escaped child,\n// nobody is left to wait for: finish now instead of sleeping out the grace.\n// An unreadable table keeps the deadline.\nconst settleVacantGroup = () => {\n if (!stopping || killing || escaped.size !== 0) return;\n let rows;\n try { rows = snapshot(); } catch { return; }\n for (const row of rows.values()) {\n // The owner's other children are its guardian and the ps answering this\n // snapshot; the exited target is already reaped and its orphans have\n // another parent.\n if (row.group === process.pid && row.pid !== process.pid && row.parent !== process.pid && !row.zombie) return;\n }\n clearTimeout(timer);\n force();\n};\nconst spawnError = (error) => {\n send({ type: 'spawn_error', code: error.code, errno: error.errno,\n syscall: error.syscall, path: error.path, message: String(error.message).slice(0, 2048) });\n stop();\n};\nprocess.on('SIGTERM', () => { if (!stopping) stop(); });\nprocess.on('SIGINT', () => { if (!stopping) stop(); });\nprocess.on('uncaughtException', (error) => {\n try { send({ type: 'fault', reason: error.reason, message: String(error.message).slice(0, 2048) }, force); }\n finally { force(); }\n});\nprocess.on('unhandledRejection', (error) => { throw error; });\ncontrol.on('end', () => stop({ explicit: true }));\ncontrol.on('error', () => stop({ explicit: true }));\nrequests.on('end', () => stop({ explicit: true }));\nrequests.on('error', () => stop({ explicit: true }));\nrequests.setEncoding('utf8');\nrequests.on('data', (data) => {\n buffer += data;\n if (Buffer.byteLength(buffer) > 4 * 1024 * 1024) throw new SupervisorFault('control_frame_too_large', 'Control frame too large');\n for (;;) {\n const end = buffer.indexOf('\\n');\n if (end < 0) break;\n const line = buffer.slice(0, end);\n buffer = buffer.slice(end + 1);\n const message = JSON.parse(line);\n if (message.type === 'configure') {\n if (config !== undefined || stopping) throw new SupervisorFault('configuration_invalid', 'Duplicate or late configuration');\n config = message;\n } else if (message.type === 'cleanup_ack') {\n if (!config?.acknowledgeCleanup || !killing) throw new SupervisorFault('cleanup_acknowledgment_unexpected', 'Unexpected cleanup acknowledgment');\n selfKill();\n } else if (message.type === 'stop') stop(message);\n else if (message.type === 'start') {\n if (config === undefined || target !== undefined || stopping) throw new SupervisorFault('activation_invalid', 'Invalid activation');\n const descriptors = Array.from({ length: Math.max(2, ...config.userFds) + 1 }, () => 'ignore');\n for (const fd of [0, 1, 2, ...config.userFds]) descriptors[fd] = fd;\n if (config.standardFds !== undefined) {\n for (const fd of [0, 1, 2]) descriptors[fd] = config.standardFds[fd];\n }\n if (grouped) {\n // Started before the target, so no target outlives an owner unguarded.\n // Every caller descriptor slot is replaced: a guardian holding a copy\n // of the caller's output would keep that pipe from reaching EOF.\n const guarded = descriptors.map(() => 'ignore');\n guarded[0] = 'pipe';\n guardian = cp.spawn('/bin/sh', ['-c', guardianScript], { cwd: '/', env: {}, detached: false, stdio: guarded });\n // A failed launch has no pid; its later error event is the same fault.\n guardian.once('error', () => {});\n if (guardian.pid === undefined) throw new SupervisorFault('guardian_unavailable', 'Process group guardian unavailable');\n guardian.stdin.on('error', () => {});\n }\n try {\n target = cp.spawn(config.command, config.args, {\n cwd: config.cwd, env: config.env, shell: config.shell,\n windowsHide: config.windowsHide, windowsVerbatimArguments: config.windowsVerbatimArguments,\n detached: false, stdio: descriptors\n });\n } catch (error) { spawnError(error); continue; }\n target.once('spawn', () => {\n // Release every caller pipe copy. Keep the runtime's standard slots\n // valid so a later internal allocation cannot reuse a closed 0/1/2.\n if (config.standardFds !== undefined) {\n // libuv intentionally does not close Windows CRT descriptors 0..2.\n // Caller pipes arrive in separate slots; the reserved slots are NUL.\n for (const fd of config.standardFds) if (fd !== 'ignore') fs.closeSync(fd);\n } else {\n for (const fd of [0, 1, 2]) {\n fs.closeSync(fd);\n const replacement = fs.openSync(require('node:os').devNull, fd === 0 ? 'r' : 'w');\n if (replacement !== fd) throw new SupervisorFault('stream_detach_failed', 'Could not detach supervisor standard streams');\n }\n }\n for (const fd of config.userFds) fs.closeSync(fd);\n send({ type: 'spawned', pid: target.pid, ...(guardian === undefined ? {} : { guardian: guardian.pid }) });\n });\n target.once('error', spawnError);\n target.once('exit', (code, signal) => {\n targetDone = true;\n send({ type: 'exit', code, signal });\n if (grouped) { stop(); settleVacantGroup(); }\n else { killing = false; clearTimeout(timer); force(); }\n });\n } else throw new SupervisorFault('control_message_invalid', 'Invalid control message');\n }\n});\ncontrol.once('connect', () => send({ type: 'ready', version: 1, pid: process.pid, created }));\n`\n"]}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * A native Windows job guardian, attached before the owner can launch a target.
3
+ * @since 1.0.0
4
+ */
5
+ /**
6
+ * Resolve the same trusted helper for the owner's self-observation and guardian.
7
+ * @private
8
+ * @since 1.0.0
9
+ */
10
+ export declare const resolveJobExecutable: () => string;
11
+ /**
12
+ * Retains the guardian's dedicated control pipe until cleanup. EOF, including
13
+ * host death, terminates the job independently of the Node owner's event loop.
14
+ * @private
15
+ * @since 1.0.0
16
+ */
17
+ export declare class WindowsProcessJob {
18
+ readonly ready: {
19
+ promise: Promise<void>;
20
+ resolve: (value: void) => void;
21
+ reject: (cause: unknown) => void;
22
+ };
23
+ readonly settled: {
24
+ promise: Promise<void>;
25
+ resolve: (value: void) => void;
26
+ reject: (cause: unknown) => void;
27
+ };
28
+ private readonly child;
29
+ private receivedReady;
30
+ private receivedSettled;
31
+ private failed;
32
+ constructor(ownerPid: number, created: unknown, executable: string);
33
+ private fail;
34
+ /** Closing this pipe asks the native guardian to terminate its job. */
35
+ stop(): void;
36
+ /** Keep the guardian and all three pipes consistent with the host handle. */
37
+ reference(referenced: boolean): void;
38
+ }
39
+ //# sourceMappingURL=WindowsProcessJob.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WindowsProcessJob.d.ts","sourceRoot":"","sources":["../../../src/internal/WindowsProcessJob.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmBH;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,QAAO,MAKvC,CAAA;AAED;;;;;GAKG;AACH,qBAAa,iBAAiB;IAC5B,QAAQ,CAAC,KAAK;;kCA7Bc,IAAI;wBACX,OAAO,KAAK,IAAI;MA4BJ;IACjC,QAAQ,CAAC,OAAO;;kCA9BY,IAAI;wBACX,OAAO,KAAK,IAAI;MA6BF;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAA;IACtB,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,eAAe,CAAQ;IAC/B,OAAO,CAAC,MAAM,CAAQ;gBAEV,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM;IA+ClE,OAAO,CAAC,IAAI;IAOZ,uEAAuE;IACvE,IAAI,IAAI,IAAI;IAIZ,6EAA6E;IAC7E,SAAS,CAAC,UAAU,EAAE,OAAO,GAAG,IAAI;CAKrC"}