@nimbus-sh/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1056) hide show
  1. package/dist/_shared/ai-egress.d.ts +73 -0
  2. package/dist/_shared/ai-egress.d.ts.map +1 -0
  3. package/dist/_shared/ai-egress.js +88 -0
  4. package/dist/_shared/byte-stream.d.ts +59 -0
  5. package/dist/_shared/byte-stream.d.ts.map +1 -0
  6. package/dist/_shared/byte-stream.js +77 -0
  7. package/dist/_shared/bytes.d.ts +18 -0
  8. package/dist/_shared/bytes.d.ts.map +1 -0
  9. package/dist/_shared/bytes.js +17 -0
  10. package/dist/_shared/cache-stats.d.ts +145 -0
  11. package/dist/_shared/cache-stats.d.ts.map +1 -0
  12. package/dist/_shared/cache-stats.js +161 -0
  13. package/dist/_shared/crypto.d.ts +17 -0
  14. package/dist/_shared/crypto.d.ts.map +1 -0
  15. package/dist/_shared/crypto.js +131 -0
  16. package/dist/_shared/esbuild-facet-shim.d.ts +21 -0
  17. package/dist/_shared/esbuild-facet-shim.d.ts.map +1 -0
  18. package/dist/_shared/esbuild-facet-shim.js +22 -0
  19. package/dist/_shared/exports-resolver.d.ts +74 -0
  20. package/dist/_shared/exports-resolver.d.ts.map +1 -0
  21. package/dist/_shared/exports-resolver.js +284 -0
  22. package/dist/_shared/facet-vfs-cursor.d.ts +48 -0
  23. package/dist/_shared/facet-vfs-cursor.d.ts.map +1 -0
  24. package/dist/_shared/facet-vfs-cursor.js +51 -0
  25. package/dist/_shared/install-phase.d.ts +47 -0
  26. package/dist/_shared/install-phase.d.ts.map +1 -0
  27. package/dist/_shared/install-phase.js +1 -0
  28. package/dist/_shared/lru-map.d.ts +25 -0
  29. package/dist/_shared/lru-map.d.ts.map +1 -0
  30. package/dist/_shared/lru-map.js +57 -0
  31. package/dist/_shared/real-node-imports.d.ts +43 -0
  32. package/dist/_shared/real-node-imports.d.ts.map +1 -0
  33. package/dist/_shared/real-node-imports.js +52 -0
  34. package/dist/_shared/retry.d.ts +92 -0
  35. package/dist/_shared/retry.d.ts.map +1 -0
  36. package/dist/_shared/retry.js +155 -0
  37. package/dist/_shared/rpc-dispose.d.ts +4 -0
  38. package/dist/_shared/rpc-dispose.d.ts.map +1 -0
  39. package/dist/_shared/rpc-dispose.js +30 -0
  40. package/dist/_shared/terminal.d.ts +2 -0
  41. package/dist/_shared/terminal.d.ts.map +1 -0
  42. package/dist/_shared/terminal.js +3 -0
  43. package/dist/_shared/typescript-specifiers.d.ts +58 -0
  44. package/dist/_shared/typescript-specifiers.d.ts.map +1 -0
  45. package/dist/_shared/typescript-specifiers.js +84 -0
  46. package/dist/_shared/untrusted-request.d.ts +34 -0
  47. package/dist/_shared/untrusted-request.d.ts.map +1 -0
  48. package/dist/_shared/untrusted-request.js +74 -0
  49. package/dist/_shared/vfs-write-ledger.d.ts +3 -0
  50. package/dist/_shared/vfs-write-ledger.d.ts.map +1 -0
  51. package/dist/_shared/vfs-write-ledger.js +439 -0
  52. package/dist/_shared/w7-frame.d.ts +79 -0
  53. package/dist/_shared/w7-frame.d.ts.map +1 -0
  54. package/dist/_shared/w7-frame.js +839 -0
  55. package/dist/_shared/weighted-credit-pool.d.ts +61 -0
  56. package/dist/_shared/weighted-credit-pool.d.ts.map +1 -0
  57. package/dist/_shared/weighted-credit-pool.js +196 -0
  58. package/dist/constants.d.ts +64 -0
  59. package/dist/constants.d.ts.map +1 -0
  60. package/dist/constants.js +264 -0
  61. package/dist/index.d.ts +16 -0
  62. package/dist/index.d.ts.map +1 -0
  63. package/dist/index.js +13 -0
  64. package/dist/observability/diag-counters.d.ts +236 -0
  65. package/dist/observability/diag-counters.d.ts.map +1 -0
  66. package/dist/observability/diag-counters.js +195 -0
  67. package/dist/observability/heap-estimate.d.ts +225 -0
  68. package/dist/observability/heap-estimate.d.ts.map +1 -0
  69. package/dist/observability/heap-estimate.js +185 -0
  70. package/dist/observability/heavy-alloc-coord.d.ts +93 -0
  71. package/dist/observability/heavy-alloc-coord.d.ts.map +1 -0
  72. package/dist/observability/heavy-alloc-coord.js +181 -0
  73. package/dist/observability/oom-classify.d.ts +138 -0
  74. package/dist/observability/oom-classify.d.ts.map +1 -0
  75. package/dist/observability/oom-classify.js +261 -0
  76. package/dist/observability/oom-discriminator.d.ts +176 -0
  77. package/dist/observability/oom-discriminator.d.ts.map +1 -0
  78. package/dist/observability/oom-discriminator.js +272 -0
  79. package/dist/runtime/assets-loader.d.ts +71 -0
  80. package/dist/runtime/assets-loader.d.ts.map +1 -0
  81. package/dist/runtime/assets-loader.js +139 -0
  82. package/dist/runtime/barrel-detect.d.ts +46 -0
  83. package/dist/runtime/barrel-detect.d.ts.map +1 -0
  84. package/dist/runtime/barrel-detect.js +73 -0
  85. package/dist/runtime/bash/preamble.d.ts +2 -0
  86. package/dist/runtime/bash/preamble.d.ts.map +1 -0
  87. package/dist/runtime/bash/preamble.js +1849 -0
  88. package/dist/runtime/bash/types.d.ts +433 -0
  89. package/dist/runtime/bash/types.d.ts.map +1 -0
  90. package/dist/runtime/bash/types.js +1 -0
  91. package/dist/runtime/bundle-profile.d.ts +14 -0
  92. package/dist/runtime/bundle-profile.d.ts.map +1 -0
  93. package/dist/runtime/bundle-profile.js +20 -0
  94. package/dist/runtime/cirrus-vite-config-rewriter.d.ts +2 -0
  95. package/dist/runtime/cirrus-vite-config-rewriter.d.ts.map +1 -0
  96. package/dist/runtime/cirrus-vite-config-rewriter.js +28 -0
  97. package/dist/runtime/cli-flags.d.ts +2 -0
  98. package/dist/runtime/cli-flags.d.ts.map +1 -0
  99. package/dist/runtime/cli-flags.js +11 -0
  100. package/dist/runtime/comment-strip.d.ts +37 -0
  101. package/dist/runtime/comment-strip.d.ts.map +1 -0
  102. package/dist/runtime/comment-strip.js +74 -0
  103. package/dist/runtime/cpython-preamble.d.ts +32 -0
  104. package/dist/runtime/cpython-preamble.d.ts.map +1 -0
  105. package/dist/runtime/cpython-preamble.js +296 -0
  106. package/dist/runtime/esbuild-service.d.ts +242 -0
  107. package/dist/runtime/esbuild-service.d.ts.map +1 -0
  108. package/dist/runtime/esbuild-service.js +1452 -0
  109. package/dist/runtime/framework-detect.d.ts +70 -0
  110. package/dist/runtime/framework-detect.d.ts.map +1 -0
  111. package/dist/runtime/framework-detect.js +177 -0
  112. package/dist/runtime/import-meta-transform.d.ts +3 -0
  113. package/dist/runtime/import-meta-transform.d.ts.map +1 -0
  114. package/dist/runtime/import-meta-transform.js +15 -0
  115. package/dist/runtime/javascript-ast.d.ts +13 -0
  116. package/dist/runtime/javascript-ast.d.ts.map +1 -0
  117. package/dist/runtime/javascript-ast.js +57 -0
  118. package/dist/runtime/long-running-handle.d.ts +119 -0
  119. package/dist/runtime/long-running-handle.d.ts.map +1 -0
  120. package/dist/runtime/long-running-handle.js +169 -0
  121. package/dist/runtime/module-source-rewriter.d.ts +11 -0
  122. package/dist/runtime/module-source-rewriter.d.ts.map +1 -0
  123. package/dist/runtime/module-source-rewriter.js +61 -0
  124. package/dist/runtime/opentui-wasm-backend.d.ts +160 -0
  125. package/dist/runtime/opentui-wasm-backend.d.ts.map +1 -0
  126. package/dist/runtime/opentui-wasm-backend.js +416 -0
  127. package/dist/runtime/os-contracts.d.ts +436 -0
  128. package/dist/runtime/os-contracts.d.ts.map +1 -0
  129. package/dist/runtime/os-contracts.js +101 -0
  130. package/dist/runtime/port-registry.d.ts +100 -0
  131. package/dist/runtime/port-registry.d.ts.map +1 -0
  132. package/dist/runtime/port-registry.js +265 -0
  133. package/dist/runtime/process-input-routing.d.ts +33 -0
  134. package/dist/runtime/process-input-routing.d.ts.map +1 -0
  135. package/dist/runtime/process-input-routing.js +59 -0
  136. package/dist/runtime/process-input.d.ts +39 -0
  137. package/dist/runtime/process-input.d.ts.map +1 -0
  138. package/dist/runtime/process-input.js +117 -0
  139. package/dist/runtime/process-io-protocol.d.ts +90 -0
  140. package/dist/runtime/process-io-protocol.d.ts.map +1 -0
  141. package/dist/runtime/process-io-protocol.js +81 -0
  142. package/dist/runtime/process-logs.d.ts +352 -0
  143. package/dist/runtime/process-logs.d.ts.map +1 -0
  144. package/dist/runtime/process-logs.js +750 -0
  145. package/dist/runtime/process-table.d.ts +101 -0
  146. package/dist/runtime/process-table.d.ts.map +1 -0
  147. package/dist/runtime/process-table.js +175 -0
  148. package/dist/runtime/project-detect.d.ts +21 -0
  149. package/dist/runtime/project-detect.d.ts.map +1 -0
  150. package/dist/runtime/project-detect.js +46 -0
  151. package/dist/runtime/python-server-adapter.d.ts +33 -0
  152. package/dist/runtime/python-server-adapter.d.ts.map +1 -0
  153. package/dist/runtime/python-server-adapter.js +132 -0
  154. package/dist/runtime/require-resolver.d.ts +44 -0
  155. package/dist/runtime/require-resolver.d.ts.map +1 -0
  156. package/dist/runtime/require-resolver.js +698 -0
  157. package/dist/runtime/router-basename.d.ts +36 -0
  158. package/dist/runtime/router-basename.d.ts.map +1 -0
  159. package/dist/runtime/router-basename.js +310 -0
  160. package/dist/runtime/ruby-green-threads.d.ts +136 -0
  161. package/dist/runtime/ruby-green-threads.d.ts.map +1 -0
  162. package/dist/runtime/ruby-green-threads.js +904 -0
  163. package/dist/runtime/ruby-socket-shim.d.ts +2 -0
  164. package/dist/runtime/ruby-socket-shim.d.ts.map +1 -0
  165. package/dist/runtime/ruby-socket-shim.js +548 -0
  166. package/dist/runtime/session-process-supervisor.d.ts +156 -0
  167. package/dist/runtime/session-process-supervisor.d.ts.map +1 -0
  168. package/dist/runtime/session-process-supervisor.js +238 -0
  169. package/dist/runtime/sqlite-runtime-fs-bridge.d.ts +70 -0
  170. package/dist/runtime/sqlite-runtime-fs-bridge.d.ts.map +1 -0
  171. package/dist/runtime/sqlite-runtime-fs-bridge.js +425 -0
  172. package/dist/runtime/streams.d.ts +13 -0
  173. package/dist/runtime/streams.d.ts.map +1 -0
  174. package/dist/runtime/streams.js +546 -0
  175. package/dist/runtime/undici-shim.d.ts +62 -0
  176. package/dist/runtime/undici-shim.d.ts.map +1 -0
  177. package/dist/runtime/undici-shim.js +516 -0
  178. package/dist/runtime/vfs-manifest.d.ts +63 -0
  179. package/dist/runtime/vfs-manifest.d.ts.map +1 -0
  180. package/dist/runtime/vfs-manifest.js +141 -0
  181. package/dist/runtime/vfs-snapshot.d.ts +75 -0
  182. package/dist/runtime/vfs-snapshot.d.ts.map +1 -0
  183. package/dist/runtime/vfs-snapshot.js +220 -0
  184. package/dist/runtime/virtual-socket-kernel.d.ts +252 -0
  185. package/dist/runtime/virtual-socket-kernel.d.ts.map +1 -0
  186. package/dist/runtime/virtual-socket-kernel.js +1143 -0
  187. package/dist/runtime/vite-config-parser.d.ts +13 -0
  188. package/dist/runtime/vite-config-parser.d.ts.map +1 -0
  189. package/dist/runtime/vite-config-parser.js +258 -0
  190. package/dist/runtime/wasi/types.d.ts +347 -0
  191. package/dist/runtime/wasi/types.d.ts.map +1 -0
  192. package/dist/runtime/wasi/types.js +1 -0
  193. package/dist/runtime/wasi-instance.d.ts +215 -0
  194. package/dist/runtime/wasi-instance.d.ts.map +1 -0
  195. package/dist/runtime/wasi-instance.generated.d.ts +14 -0
  196. package/dist/runtime/wasi-instance.generated.d.ts.map +1 -0
  197. package/dist/runtime/wasi-instance.generated.js +13 -0
  198. package/dist/runtime/wasi-instance.js +179 -0
  199. package/dist/runtime/wasi-threads.d.ts +169 -0
  200. package/dist/runtime/wasi-threads.d.ts.map +1 -0
  201. package/dist/runtime/wasi-threads.js +669 -0
  202. package/dist/runtime/wasm-memory.d.ts +84 -0
  203. package/dist/runtime/wasm-memory.d.ts.map +1 -0
  204. package/dist/runtime/wasm-memory.js +235 -0
  205. package/dist/shell/elevation-commands.d.ts +5 -0
  206. package/dist/shell/elevation-commands.d.ts.map +1 -0
  207. package/dist/shell/elevation-commands.js +109 -0
  208. package/dist/shell/exec-dispatch.d.ts +57 -0
  209. package/dist/shell/exec-dispatch.d.ts.map +1 -0
  210. package/dist/shell/exec-dispatch.js +181 -0
  211. package/dist/shell/features.d.ts +154 -0
  212. package/dist/shell/features.d.ts.map +1 -0
  213. package/dist/shell/features.js +792 -0
  214. package/dist/shell/shell-entrypoints.d.ts +55 -0
  215. package/dist/shell/shell-entrypoints.d.ts.map +1 -0
  216. package/dist/shell/shell-entrypoints.js +230 -0
  217. package/dist/shell/shell-invocation.d.ts +36 -0
  218. package/dist/shell/shell-invocation.d.ts.map +1 -0
  219. package/dist/shell/shell-invocation.js +148 -0
  220. package/dist/shell/unix-accounts.d.ts +27 -0
  221. package/dist/shell/unix-accounts.d.ts.map +1 -0
  222. package/dist/shell/unix-accounts.js +105 -0
  223. package/dist/shell/unix-commands.d.ts +15 -0
  224. package/dist/shell/unix-commands.d.ts.map +1 -0
  225. package/dist/shell/unix-commands.js +4702 -0
  226. package/dist/substrate/lifo/commands/archive/gunzip.d.ts +4 -0
  227. package/dist/substrate/lifo/commands/archive/gunzip.d.ts.map +1 -0
  228. package/dist/substrate/lifo/commands/archive/gunzip.js +58 -0
  229. package/dist/substrate/lifo/commands/archive/gzip.d.ts +4 -0
  230. package/dist/substrate/lifo/commands/archive/gzip.d.ts.map +1 -0
  231. package/dist/substrate/lifo/commands/archive/gzip.js +73 -0
  232. package/dist/substrate/lifo/commands/archive/tar.d.ts +4 -0
  233. package/dist/substrate/lifo/commands/archive/tar.d.ts.map +1 -0
  234. package/dist/substrate/lifo/commands/archive/tar.js +158 -0
  235. package/dist/substrate/lifo/commands/archive/unzip.d.ts +4 -0
  236. package/dist/substrate/lifo/commands/archive/unzip.d.ts.map +1 -0
  237. package/dist/substrate/lifo/commands/archive/unzip.js +114 -0
  238. package/dist/substrate/lifo/commands/archive/zip.d.ts +4 -0
  239. package/dist/substrate/lifo/commands/archive/zip.d.ts.map +1 -0
  240. package/dist/substrate/lifo/commands/archive/zip.js +58 -0
  241. package/dist/substrate/lifo/commands/fs/basename.d.ts +4 -0
  242. package/dist/substrate/lifo/commands/fs/basename.d.ts.map +1 -0
  243. package/dist/substrate/lifo/commands/fs/basename.js +12 -0
  244. package/dist/substrate/lifo/commands/fs/cat.d.ts +4 -0
  245. package/dist/substrate/lifo/commands/fs/cat.d.ts.map +1 -0
  246. package/dist/substrate/lifo/commands/fs/cat.js +52 -0
  247. package/dist/substrate/lifo/commands/fs/chmod.d.ts +25 -0
  248. package/dist/substrate/lifo/commands/fs/chmod.d.ts.map +1 -0
  249. package/dist/substrate/lifo/commands/fs/chmod.js +97 -0
  250. package/dist/substrate/lifo/commands/fs/chown.d.ts +4 -0
  251. package/dist/substrate/lifo/commands/fs/chown.d.ts.map +1 -0
  252. package/dist/substrate/lifo/commands/fs/chown.js +41 -0
  253. package/dist/substrate/lifo/commands/fs/cp.d.ts +4 -0
  254. package/dist/substrate/lifo/commands/fs/cp.d.ts.map +1 -0
  255. package/dist/substrate/lifo/commands/fs/cp.js +29 -0
  256. package/dist/substrate/lifo/commands/fs/df.d.ts +4 -0
  257. package/dist/substrate/lifo/commands/fs/df.d.ts.map +1 -0
  258. package/dist/substrate/lifo/commands/fs/df.js +52 -0
  259. package/dist/substrate/lifo/commands/fs/dirname.d.ts +4 -0
  260. package/dist/substrate/lifo/commands/fs/dirname.d.ts.map +1 -0
  261. package/dist/substrate/lifo/commands/fs/dirname.js +12 -0
  262. package/dist/substrate/lifo/commands/fs/du.d.ts +4 -0
  263. package/dist/substrate/lifo/commands/fs/du.d.ts.map +1 -0
  264. package/dist/substrate/lifo/commands/fs/du.js +104 -0
  265. package/dist/substrate/lifo/commands/fs/file.d.ts +4 -0
  266. package/dist/substrate/lifo/commands/fs/file.d.ts.map +1 -0
  267. package/dist/substrate/lifo/commands/fs/file.js +84 -0
  268. package/dist/substrate/lifo/commands/fs/find.d.ts +4 -0
  269. package/dist/substrate/lifo/commands/fs/find.d.ts.map +1 -0
  270. package/dist/substrate/lifo/commands/fs/find.js +72 -0
  271. package/dist/substrate/lifo/commands/fs/ln.d.ts +4 -0
  272. package/dist/substrate/lifo/commands/fs/ln.d.ts.map +1 -0
  273. package/dist/substrate/lifo/commands/fs/ln.js +15 -0
  274. package/dist/substrate/lifo/commands/fs/ls.d.ts +4 -0
  275. package/dist/substrate/lifo/commands/fs/ls.d.ts.map +1 -0
  276. package/dist/substrate/lifo/commands/fs/ls.js +146 -0
  277. package/dist/substrate/lifo/commands/fs/mkdir.d.ts +4 -0
  278. package/dist/substrate/lifo/commands/fs/mkdir.d.ts.map +1 -0
  279. package/dist/substrate/lifo/commands/fs/mkdir.js +31 -0
  280. package/dist/substrate/lifo/commands/fs/mktemp.d.ts +4 -0
  281. package/dist/substrate/lifo/commands/fs/mktemp.d.ts.map +1 -0
  282. package/dist/substrate/lifo/commands/fs/mktemp.js +48 -0
  283. package/dist/substrate/lifo/commands/fs/mv.d.ts +4 -0
  284. package/dist/substrate/lifo/commands/fs/mv.d.ts.map +1 -0
  285. package/dist/substrate/lifo/commands/fs/mv.js +113 -0
  286. package/dist/substrate/lifo/commands/fs/realpath.d.ts +4 -0
  287. package/dist/substrate/lifo/commands/fs/realpath.d.ts.map +1 -0
  288. package/dist/substrate/lifo/commands/fs/realpath.js +27 -0
  289. package/dist/substrate/lifo/commands/fs/rm.d.ts +4 -0
  290. package/dist/substrate/lifo/commands/fs/rm.d.ts.map +1 -0
  291. package/dist/substrate/lifo/commands/fs/rm.js +48 -0
  292. package/dist/substrate/lifo/commands/fs/rmdir.d.ts +4 -0
  293. package/dist/substrate/lifo/commands/fs/rmdir.d.ts.map +1 -0
  294. package/dist/substrate/lifo/commands/fs/rmdir.js +44 -0
  295. package/dist/substrate/lifo/commands/fs/stat.d.ts +4 -0
  296. package/dist/substrate/lifo/commands/fs/stat.d.ts.map +1 -0
  297. package/dist/substrate/lifo/commands/fs/stat.js +35 -0
  298. package/dist/substrate/lifo/commands/fs/touch.d.ts +4 -0
  299. package/dist/substrate/lifo/commands/fs/touch.d.ts.map +1 -0
  300. package/dist/substrate/lifo/commands/fs/touch.js +26 -0
  301. package/dist/substrate/lifo/commands/fs/tree.d.ts +4 -0
  302. package/dist/substrate/lifo/commands/fs/tree.d.ts.map +1 -0
  303. package/dist/substrate/lifo/commands/fs/tree.js +69 -0
  304. package/dist/substrate/lifo/commands/index.d.ts +3 -0
  305. package/dist/substrate/lifo/commands/index.d.ts.map +1 -0
  306. package/dist/substrate/lifo/commands/index.js +1 -0
  307. package/dist/substrate/lifo/commands/io/dd.d.ts +4 -0
  308. package/dist/substrate/lifo/commands/io/dd.d.ts.map +1 -0
  309. package/dist/substrate/lifo/commands/io/dd.js +256 -0
  310. package/dist/substrate/lifo/commands/io/printf.d.ts +4 -0
  311. package/dist/substrate/lifo/commands/io/printf.d.ts.map +1 -0
  312. package/dist/substrate/lifo/commands/io/printf.js +82 -0
  313. package/dist/substrate/lifo/commands/io/tee.d.ts +4 -0
  314. package/dist/substrate/lifo/commands/io/tee.d.ts.map +1 -0
  315. package/dist/substrate/lifo/commands/io/tee.js +31 -0
  316. package/dist/substrate/lifo/commands/io/xargs.d.ts +4 -0
  317. package/dist/substrate/lifo/commands/io/xargs.d.ts.map +1 -0
  318. package/dist/substrate/lifo/commands/io/xargs.js +44 -0
  319. package/dist/substrate/lifo/commands/io/yes.d.ts +4 -0
  320. package/dist/substrate/lifo/commands/io/yes.d.ts.map +1 -0
  321. package/dist/substrate/lifo/commands/io/yes.js +10 -0
  322. package/dist/substrate/lifo/commands/net/curl.d.ts +6 -0
  323. package/dist/substrate/lifo/commands/net/curl.d.ts.map +1 -0
  324. package/dist/substrate/lifo/commands/net/curl.js +617 -0
  325. package/dist/substrate/lifo/commands/net/dig.d.ts +4 -0
  326. package/dist/substrate/lifo/commands/net/dig.d.ts.map +1 -0
  327. package/dist/substrate/lifo/commands/net/dig.js +77 -0
  328. package/dist/substrate/lifo/commands/net/forward.d.ts +14 -0
  329. package/dist/substrate/lifo/commands/net/forward.d.ts.map +1 -0
  330. package/dist/substrate/lifo/commands/net/forward.js +80 -0
  331. package/dist/substrate/lifo/commands/net/host.d.ts +14 -0
  332. package/dist/substrate/lifo/commands/net/host.d.ts.map +1 -0
  333. package/dist/substrate/lifo/commands/net/host.js +160 -0
  334. package/dist/substrate/lifo/commands/net/ifconfig.d.ts +8 -0
  335. package/dist/substrate/lifo/commands/net/ifconfig.d.ts.map +1 -0
  336. package/dist/substrate/lifo/commands/net/ifconfig.js +120 -0
  337. package/dist/substrate/lifo/commands/net/ip.d.ts +14 -0
  338. package/dist/substrate/lifo/commands/net/ip.d.ts.map +1 -0
  339. package/dist/substrate/lifo/commands/net/ip.js +508 -0
  340. package/dist/substrate/lifo/commands/net/netstat.d.ts +8 -0
  341. package/dist/substrate/lifo/commands/net/netstat.d.ts.map +1 -0
  342. package/dist/substrate/lifo/commands/net/netstat.js +94 -0
  343. package/dist/substrate/lifo/commands/net/ping.d.ts +4 -0
  344. package/dist/substrate/lifo/commands/net/ping.d.ts.map +1 -0
  345. package/dist/substrate/lifo/commands/net/ping.js +64 -0
  346. package/dist/substrate/lifo/commands/net/ports.d.ts +8 -0
  347. package/dist/substrate/lifo/commands/net/ports.d.ts.map +1 -0
  348. package/dist/substrate/lifo/commands/net/ports.js +36 -0
  349. package/dist/substrate/lifo/commands/net/route.d.ts +8 -0
  350. package/dist/substrate/lifo/commands/net/route.d.ts.map +1 -0
  351. package/dist/substrate/lifo/commands/net/route.js +128 -0
  352. package/dist/substrate/lifo/commands/net/tunnel-v2.d.ts +4 -0
  353. package/dist/substrate/lifo/commands/net/tunnel-v2.d.ts.map +1 -0
  354. package/dist/substrate/lifo/commands/net/tunnel-v2.js +141 -0
  355. package/dist/substrate/lifo/commands/net/tunnel.d.ts +6 -0
  356. package/dist/substrate/lifo/commands/net/tunnel.d.ts.map +1 -0
  357. package/dist/substrate/lifo/commands/net/tunnel.js +232 -0
  358. package/dist/substrate/lifo/commands/net/wget.d.ts +4 -0
  359. package/dist/substrate/lifo/commands/net/wget.d.ts.map +1 -0
  360. package/dist/substrate/lifo/commands/net/wget.js +78 -0
  361. package/dist/substrate/lifo/commands/registry.d.ts +15 -0
  362. package/dist/substrate/lifo/commands/registry.d.ts.map +1 -0
  363. package/dist/substrate/lifo/commands/registry.js +120 -0
  364. package/dist/substrate/lifo/commands/signal.d.ts +12 -0
  365. package/dist/substrate/lifo/commands/signal.d.ts.map +1 -0
  366. package/dist/substrate/lifo/commands/signal.js +47 -0
  367. package/dist/substrate/lifo/commands/system/bc.d.ts +4 -0
  368. package/dist/substrate/lifo/commands/system/bc.d.ts.map +1 -0
  369. package/dist/substrate/lifo/commands/system/bc.js +243 -0
  370. package/dist/substrate/lifo/commands/system/cal.d.ts +4 -0
  371. package/dist/substrate/lifo/commands/system/cal.d.ts.map +1 -0
  372. package/dist/substrate/lifo/commands/system/cal.js +81 -0
  373. package/dist/substrate/lifo/commands/system/date.d.ts +4 -0
  374. package/dist/substrate/lifo/commands/system/date.d.ts.map +1 -0
  375. package/dist/substrate/lifo/commands/system/date.js +79 -0
  376. package/dist/substrate/lifo/commands/system/env.d.ts +4 -0
  377. package/dist/substrate/lifo/commands/system/env.d.ts.map +1 -0
  378. package/dist/substrate/lifo/commands/system/env.js +7 -0
  379. package/dist/substrate/lifo/commands/system/fastfetch.d.ts +4 -0
  380. package/dist/substrate/lifo/commands/system/fastfetch.d.ts.map +1 -0
  381. package/dist/substrate/lifo/commands/system/fastfetch.js +385 -0
  382. package/dist/substrate/lifo/commands/system/free.d.ts +4 -0
  383. package/dist/substrate/lifo/commands/system/free.d.ts.map +1 -0
  384. package/dist/substrate/lifo/commands/system/free.js +36 -0
  385. package/dist/substrate/lifo/commands/system/help.d.ts +4 -0
  386. package/dist/substrate/lifo/commands/system/help.d.ts.map +1 -0
  387. package/dist/substrate/lifo/commands/system/help.js +46 -0
  388. package/dist/substrate/lifo/commands/system/hostname.d.ts +4 -0
  389. package/dist/substrate/lifo/commands/system/hostname.d.ts.map +1 -0
  390. package/dist/substrate/lifo/commands/system/hostname.js +6 -0
  391. package/dist/substrate/lifo/commands/system/kill.d.ts +4 -0
  392. package/dist/substrate/lifo/commands/system/kill.d.ts.map +1 -0
  393. package/dist/substrate/lifo/commands/system/kill.js +76 -0
  394. package/dist/substrate/lifo/commands/system/lifo.d.ts +41 -0
  395. package/dist/substrate/lifo/commands/system/lifo.d.ts.map +1 -0
  396. package/dist/substrate/lifo/commands/system/lifo.js +446 -0
  397. package/dist/substrate/lifo/commands/system/logout.d.ts +5 -0
  398. package/dist/substrate/lifo/commands/system/logout.d.ts.map +1 -0
  399. package/dist/substrate/lifo/commands/system/logout.js +15 -0
  400. package/dist/substrate/lifo/commands/system/man.d.ts +4 -0
  401. package/dist/substrate/lifo/commands/system/man.d.ts.map +1 -0
  402. package/dist/substrate/lifo/commands/system/man.js +144 -0
  403. package/dist/substrate/lifo/commands/system/node.d.ts +6 -0
  404. package/dist/substrate/lifo/commands/system/node.d.ts.map +1 -0
  405. package/dist/substrate/lifo/commands/system/node.js +1241 -0
  406. package/dist/substrate/lifo/commands/system/npm.d.ts +26 -0
  407. package/dist/substrate/lifo/commands/system/npm.d.ts.map +1 -0
  408. package/dist/substrate/lifo/commands/system/npm.js +934 -0
  409. package/dist/substrate/lifo/commands/system/pkg.d.ts +4 -0
  410. package/dist/substrate/lifo/commands/system/pkg.d.ts.map +1 -0
  411. package/dist/substrate/lifo/commands/system/pkg.js +97 -0
  412. package/dist/substrate/lifo/commands/system/ps.d.ts +5 -0
  413. package/dist/substrate/lifo/commands/system/ps.d.ts.map +1 -0
  414. package/dist/substrate/lifo/commands/system/ps.js +35 -0
  415. package/dist/substrate/lifo/commands/system/registry-schemas.d.ts +44 -0
  416. package/dist/substrate/lifo/commands/system/registry-schemas.d.ts.map +1 -0
  417. package/dist/substrate/lifo/commands/system/registry-schemas.js +28 -0
  418. package/dist/substrate/lifo/commands/system/sha256sum.d.ts +4 -0
  419. package/dist/substrate/lifo/commands/system/sha256sum.d.ts.map +1 -0
  420. package/dist/substrate/lifo/commands/system/sha256sum.js +86 -0
  421. package/dist/substrate/lifo/commands/system/sl.d.ts +4 -0
  422. package/dist/substrate/lifo/commands/system/sl.d.ts.map +1 -0
  423. package/dist/substrate/lifo/commands/system/sl.js +204 -0
  424. package/dist/substrate/lifo/commands/system/sleep.d.ts +4 -0
  425. package/dist/substrate/lifo/commands/system/sleep.d.ts.map +1 -0
  426. package/dist/substrate/lifo/commands/system/sleep.js +27 -0
  427. package/dist/substrate/lifo/commands/system/stty.d.ts +4 -0
  428. package/dist/substrate/lifo/commands/system/stty.d.ts.map +1 -0
  429. package/dist/substrate/lifo/commands/system/stty.js +61 -0
  430. package/dist/substrate/lifo/commands/system/systemctl.d.ts +4 -0
  431. package/dist/substrate/lifo/commands/system/systemctl.d.ts.map +1 -0
  432. package/dist/substrate/lifo/commands/system/systemctl.js +164 -0
  433. package/dist/substrate/lifo/commands/system/top.d.ts +4 -0
  434. package/dist/substrate/lifo/commands/system/top.d.ts.map +1 -0
  435. package/dist/substrate/lifo/commands/system/top.js +38 -0
  436. package/dist/substrate/lifo/commands/system/uname.d.ts +4 -0
  437. package/dist/substrate/lifo/commands/system/uname.d.ts.map +1 -0
  438. package/dist/substrate/lifo/commands/system/uname.js +55 -0
  439. package/dist/substrate/lifo/commands/system/uptime.d.ts +4 -0
  440. package/dist/substrate/lifo/commands/system/uptime.d.ts.map +1 -0
  441. package/dist/substrate/lifo/commands/system/uptime.js +16 -0
  442. package/dist/substrate/lifo/commands/system/watch.d.ts +4 -0
  443. package/dist/substrate/lifo/commands/system/watch.d.ts.map +1 -0
  444. package/dist/substrate/lifo/commands/system/watch.js +53 -0
  445. package/dist/substrate/lifo/commands/system/which.d.ts +4 -0
  446. package/dist/substrate/lifo/commands/system/which.d.ts.map +1 -0
  447. package/dist/substrate/lifo/commands/system/which.js +45 -0
  448. package/dist/substrate/lifo/commands/system/whoami.d.ts +4 -0
  449. package/dist/substrate/lifo/commands/system/whoami.d.ts.map +1 -0
  450. package/dist/substrate/lifo/commands/system/whoami.js +6 -0
  451. package/dist/substrate/lifo/commands/text/awk.d.ts +4 -0
  452. package/dist/substrate/lifo/commands/text/awk.d.ts.map +1 -0
  453. package/dist/substrate/lifo/commands/text/awk.js +200 -0
  454. package/dist/substrate/lifo/commands/text/base64.d.ts +4 -0
  455. package/dist/substrate/lifo/commands/text/base64.d.ts.map +1 -0
  456. package/dist/substrate/lifo/commands/text/base64.js +102 -0
  457. package/dist/substrate/lifo/commands/text/cut.d.ts +4 -0
  458. package/dist/substrate/lifo/commands/text/cut.d.ts.map +1 -0
  459. package/dist/substrate/lifo/commands/text/cut.js +91 -0
  460. package/dist/substrate/lifo/commands/text/diff.d.ts +4 -0
  461. package/dist/substrate/lifo/commands/text/diff.d.ts.map +1 -0
  462. package/dist/substrate/lifo/commands/text/diff.js +292 -0
  463. package/dist/substrate/lifo/commands/text/grep.d.ts +4 -0
  464. package/dist/substrate/lifo/commands/text/grep.d.ts.map +1 -0
  465. package/dist/substrate/lifo/commands/text/grep.js +189 -0
  466. package/dist/substrate/lifo/commands/text/head.d.ts +4 -0
  467. package/dist/substrate/lifo/commands/text/head.d.ts.map +1 -0
  468. package/dist/substrate/lifo/commands/text/head.js +111 -0
  469. package/dist/substrate/lifo/commands/text/less.d.ts +4 -0
  470. package/dist/substrate/lifo/commands/text/less.d.ts.map +1 -0
  471. package/dist/substrate/lifo/commands/text/less.js +335 -0
  472. package/dist/substrate/lifo/commands/text/nano.d.ts +4 -0
  473. package/dist/substrate/lifo/commands/text/nano.d.ts.map +1 -0
  474. package/dist/substrate/lifo/commands/text/nano.js +510 -0
  475. package/dist/substrate/lifo/commands/text/nl.d.ts +4 -0
  476. package/dist/substrate/lifo/commands/text/nl.d.ts.map +1 -0
  477. package/dist/substrate/lifo/commands/text/nl.js +64 -0
  478. package/dist/substrate/lifo/commands/text/rev.d.ts +4 -0
  479. package/dist/substrate/lifo/commands/text/rev.d.ts.map +1 -0
  480. package/dist/substrate/lifo/commands/text/rev.js +41 -0
  481. package/dist/substrate/lifo/commands/text/sed.d.ts +21 -0
  482. package/dist/substrate/lifo/commands/text/sed.d.ts.map +1 -0
  483. package/dist/substrate/lifo/commands/text/sed.js +248 -0
  484. package/dist/substrate/lifo/commands/text/seq.d.ts +4 -0
  485. package/dist/substrate/lifo/commands/text/seq.d.ts.map +1 -0
  486. package/dist/substrate/lifo/commands/text/seq.js +69 -0
  487. package/dist/substrate/lifo/commands/text/sort.d.ts +4 -0
  488. package/dist/substrate/lifo/commands/text/sort.d.ts.map +1 -0
  489. package/dist/substrate/lifo/commands/text/sort.js +90 -0
  490. package/dist/substrate/lifo/commands/text/strings.d.ts +4 -0
  491. package/dist/substrate/lifo/commands/text/strings.d.ts.map +1 -0
  492. package/dist/substrate/lifo/commands/text/strings.js +69 -0
  493. package/dist/substrate/lifo/commands/text/tac.d.ts +4 -0
  494. package/dist/substrate/lifo/commands/text/tac.d.ts.map +1 -0
  495. package/dist/substrate/lifo/commands/text/tac.js +32 -0
  496. package/dist/substrate/lifo/commands/text/tail.d.ts +4 -0
  497. package/dist/substrate/lifo/commands/text/tail.d.ts.map +1 -0
  498. package/dist/substrate/lifo/commands/text/tail.js +64 -0
  499. package/dist/substrate/lifo/commands/text/tr.d.ts +4 -0
  500. package/dist/substrate/lifo/commands/text/tr.d.ts.map +1 -0
  501. package/dist/substrate/lifo/commands/text/tr.js +180 -0
  502. package/dist/substrate/lifo/commands/text/uniq.d.ts +4 -0
  503. package/dist/substrate/lifo/commands/text/uniq.d.ts.map +1 -0
  504. package/dist/substrate/lifo/commands/text/uniq.js +82 -0
  505. package/dist/substrate/lifo/commands/text/wc.d.ts +4 -0
  506. package/dist/substrate/lifo/commands/text/wc.d.ts.map +1 -0
  507. package/dist/substrate/lifo/commands/text/wc.js +107 -0
  508. package/dist/substrate/lifo/commands/types.d.ts +49 -0
  509. package/dist/substrate/lifo/commands/types.d.ts.map +1 -0
  510. package/dist/substrate/lifo/commands/types.js +1 -0
  511. package/dist/substrate/lifo/index.d.ts +67 -0
  512. package/dist/substrate/lifo/index.d.ts.map +1 -0
  513. package/dist/substrate/lifo/index.js +66 -0
  514. package/dist/substrate/lifo/kernel/ServiceManager.d.ts +51 -0
  515. package/dist/substrate/lifo/kernel/ServiceManager.d.ts.map +1 -0
  516. package/dist/substrate/lifo/kernel/ServiceManager.js +302 -0
  517. package/dist/substrate/lifo/kernel/index.d.ts +40 -0
  518. package/dist/substrate/lifo/kernel/index.d.ts.map +1 -0
  519. package/dist/substrate/lifo/kernel/index.js +170 -0
  520. package/dist/substrate/lifo/kernel/network/Bridge.d.ts +110 -0
  521. package/dist/substrate/lifo/kernel/network/Bridge.d.ts.map +1 -0
  522. package/dist/substrate/lifo/kernel/network/Bridge.js +278 -0
  523. package/dist/substrate/lifo/kernel/network/DNSResolver.d.ts +50 -0
  524. package/dist/substrate/lifo/kernel/network/DNSResolver.d.ts.map +1 -0
  525. package/dist/substrate/lifo/kernel/network/DNSResolver.js +135 -0
  526. package/dist/substrate/lifo/kernel/network/NetworkInterface.d.ts +83 -0
  527. package/dist/substrate/lifo/kernel/network/NetworkInterface.d.ts.map +1 -0
  528. package/dist/substrate/lifo/kernel/network/NetworkInterface.js +183 -0
  529. package/dist/substrate/lifo/kernel/network/NetworkNamespace.d.ts +98 -0
  530. package/dist/substrate/lifo/kernel/network/NetworkNamespace.d.ts.map +1 -0
  531. package/dist/substrate/lifo/kernel/network/NetworkNamespace.js +149 -0
  532. package/dist/substrate/lifo/kernel/network/NetworkStack.d.ts +178 -0
  533. package/dist/substrate/lifo/kernel/network/NetworkStack.d.ts.map +1 -0
  534. package/dist/substrate/lifo/kernel/network/NetworkStack.js +460 -0
  535. package/dist/substrate/lifo/kernel/network/PortBridge.d.ts +44 -0
  536. package/dist/substrate/lifo/kernel/network/PortBridge.d.ts.map +1 -0
  537. package/dist/substrate/lifo/kernel/network/PortBridge.js +158 -0
  538. package/dist/substrate/lifo/kernel/network/RoutingTable.d.ts +55 -0
  539. package/dist/substrate/lifo/kernel/network/RoutingTable.d.ts.map +1 -0
  540. package/dist/substrate/lifo/kernel/network/RoutingTable.js +167 -0
  541. package/dist/substrate/lifo/kernel/network/Socket.d.ts +65 -0
  542. package/dist/substrate/lifo/kernel/network/Socket.d.ts.map +1 -0
  543. package/dist/substrate/lifo/kernel/network/Socket.js +201 -0
  544. package/dist/substrate/lifo/kernel/network/index.d.ts +11 -0
  545. package/dist/substrate/lifo/kernel/network/index.d.ts.map +1 -0
  546. package/dist/substrate/lifo/kernel/network/index.js +9 -0
  547. package/dist/substrate/lifo/kernel/network/tunnel/BaseTunnel.d.ts +55 -0
  548. package/dist/substrate/lifo/kernel/network/tunnel/BaseTunnel.d.ts.map +1 -0
  549. package/dist/substrate/lifo/kernel/network/tunnel/BaseTunnel.js +88 -0
  550. package/dist/substrate/lifo/kernel/network/tunnel/VETHPair.d.ts +71 -0
  551. package/dist/substrate/lifo/kernel/network/tunnel/VETHPair.d.ts.map +1 -0
  552. package/dist/substrate/lifo/kernel/network/tunnel/VETHPair.js +191 -0
  553. package/dist/substrate/lifo/kernel/network/tunnel/WebSocketTunnel.d.ts +89 -0
  554. package/dist/substrate/lifo/kernel/network/tunnel/WebSocketTunnel.d.ts.map +1 -0
  555. package/dist/substrate/lifo/kernel/network/tunnel/WebSocketTunnel.js +324 -0
  556. package/dist/substrate/lifo/kernel/network/types.d.ts +159 -0
  557. package/dist/substrate/lifo/kernel/network/types.d.ts.map +1 -0
  558. package/dist/substrate/lifo/kernel/network/types.js +5 -0
  559. package/dist/substrate/lifo/kernel/persistence/PersistenceManager.d.ts +12 -0
  560. package/dist/substrate/lifo/kernel/persistence/PersistenceManager.d.ts.map +1 -0
  561. package/dist/substrate/lifo/kernel/persistence/PersistenceManager.js +47 -0
  562. package/dist/substrate/lifo/kernel/persistence/backends.d.ts +15 -0
  563. package/dist/substrate/lifo/kernel/persistence/backends.d.ts.map +1 -0
  564. package/dist/substrate/lifo/kernel/persistence/backends.js +18 -0
  565. package/dist/substrate/lifo/kernel/persistence/index.d.ts +6 -0
  566. package/dist/substrate/lifo/kernel/persistence/index.d.ts.map +1 -0
  567. package/dist/substrate/lifo/kernel/persistence/index.js +3 -0
  568. package/dist/substrate/lifo/kernel/persistence/serializer.d.ts +21 -0
  569. package/dist/substrate/lifo/kernel/persistence/serializer.d.ts.map +1 -0
  570. package/dist/substrate/lifo/kernel/persistence/serializer.js +99 -0
  571. package/dist/substrate/lifo/kernel/samples.d.ts +3 -0
  572. package/dist/substrate/lifo/kernel/samples.d.ts.map +1 -0
  573. package/dist/substrate/lifo/kernel/samples.js +930 -0
  574. package/dist/substrate/lifo/kernel/storage/BlobStore.d.ts +22 -0
  575. package/dist/substrate/lifo/kernel/storage/BlobStore.d.ts.map +1 -0
  576. package/dist/substrate/lifo/kernel/storage/BlobStore.js +84 -0
  577. package/dist/substrate/lifo/kernel/storage/ContentStore.d.ts +54 -0
  578. package/dist/substrate/lifo/kernel/storage/ContentStore.d.ts.map +1 -0
  579. package/dist/substrate/lifo/kernel/storage/ContentStore.js +120 -0
  580. package/dist/substrate/lifo/kernel/storage/index.d.ts +6 -0
  581. package/dist/substrate/lifo/kernel/storage/index.d.ts.map +1 -0
  582. package/dist/substrate/lifo/kernel/storage/index.js +3 -0
  583. package/dist/substrate/lifo/kernel/unit-parser.d.ts +22 -0
  584. package/dist/substrate/lifo/kernel/unit-parser.d.ts.map +1 -0
  585. package/dist/substrate/lifo/kernel/unit-parser.js +80 -0
  586. package/dist/substrate/lifo/kernel/vfs/VFS.d.ts +99 -0
  587. package/dist/substrate/lifo/kernel/vfs/VFS.d.ts.map +1 -0
  588. package/dist/substrate/lifo/kernel/vfs/VFS.js +679 -0
  589. package/dist/substrate/lifo/kernel/vfs/index.d.ts +8 -0
  590. package/dist/substrate/lifo/kernel/vfs/index.d.ts.map +1 -0
  591. package/dist/substrate/lifo/kernel/vfs/index.js +5 -0
  592. package/dist/substrate/lifo/kernel/vfs/providers/DevProvider.d.ts +21 -0
  593. package/dist/substrate/lifo/kernel/vfs/providers/DevProvider.d.ts.map +1 -0
  594. package/dist/substrate/lifo/kernel/vfs/providers/DevProvider.js +137 -0
  595. package/dist/substrate/lifo/kernel/vfs/providers/NativeFsProvider.d.ts +63 -0
  596. package/dist/substrate/lifo/kernel/vfs/providers/NativeFsProvider.d.ts.map +1 -0
  597. package/dist/substrate/lifo/kernel/vfs/providers/NativeFsProvider.js +175 -0
  598. package/dist/substrate/lifo/kernel/vfs/providers/ProcProvider.d.ts +14 -0
  599. package/dist/substrate/lifo/kernel/vfs/providers/ProcProvider.d.ts.map +1 -0
  600. package/dist/substrate/lifo/kernel/vfs/providers/ProcProvider.js +126 -0
  601. package/dist/substrate/lifo/kernel/vfs/types.d.ts +117 -0
  602. package/dist/substrate/lifo/kernel/vfs/types.d.ts.map +1 -0
  603. package/dist/substrate/lifo/kernel/vfs/types.js +42 -0
  604. package/dist/substrate/lifo/node-compat/buffer.d.ts +44 -0
  605. package/dist/substrate/lifo/node-compat/buffer.d.ts.map +1 -0
  606. package/dist/substrate/lifo/node-compat/buffer.js +331 -0
  607. package/dist/substrate/lifo/node-compat/child_process.d.ts +10 -0
  608. package/dist/substrate/lifo/node-compat/child_process.d.ts.map +1 -0
  609. package/dist/substrate/lifo/node-compat/child_process.js +42 -0
  610. package/dist/substrate/lifo/node-compat/console.d.ts +21 -0
  611. package/dist/substrate/lifo/node-compat/console.d.ts.map +1 -0
  612. package/dist/substrate/lifo/node-compat/console.js +68 -0
  613. package/dist/substrate/lifo/node-compat/crypto.d.ts +24 -0
  614. package/dist/substrate/lifo/node-compat/crypto.d.ts.map +1 -0
  615. package/dist/substrate/lifo/node-compat/crypto.js +216 -0
  616. package/dist/substrate/lifo/node-compat/dns.d.ts +117 -0
  617. package/dist/substrate/lifo/node-compat/dns.d.ts.map +1 -0
  618. package/dist/substrate/lifo/node-compat/dns.js +144 -0
  619. package/dist/substrate/lifo/node-compat/esbuild.d.ts +10 -0
  620. package/dist/substrate/lifo/node-compat/esbuild.d.ts.map +1 -0
  621. package/dist/substrate/lifo/node-compat/esbuild.js +70 -0
  622. package/dist/substrate/lifo/node-compat/events.d.ts +19 -0
  623. package/dist/substrate/lifo/node-compat/events.d.ts.map +1 -0
  624. package/dist/substrate/lifo/node-compat/events.js +83 -0
  625. package/dist/substrate/lifo/node-compat/fs.d.ts +195 -0
  626. package/dist/substrate/lifo/node-compat/fs.d.ts.map +1 -0
  627. package/dist/substrate/lifo/node-compat/fs.js +624 -0
  628. package/dist/substrate/lifo/node-compat/http.d.ts +133 -0
  629. package/dist/substrate/lifo/node-compat/http.d.ts.map +1 -0
  630. package/dist/substrate/lifo/node-compat/http.js +452 -0
  631. package/dist/substrate/lifo/node-compat/index.d.ts +20 -0
  632. package/dist/substrate/lifo/node-compat/index.d.ts.map +1 -0
  633. package/dist/substrate/lifo/node-compat/index.js +291 -0
  634. package/dist/substrate/lifo/node-compat/module.d.ts +55 -0
  635. package/dist/substrate/lifo/node-compat/module.d.ts.map +1 -0
  636. package/dist/substrate/lifo/node-compat/module.js +124 -0
  637. package/dist/substrate/lifo/node-compat/os.d.ts +39 -0
  638. package/dist/substrate/lifo/node-compat/os.d.ts.map +1 -0
  639. package/dist/substrate/lifo/node-compat/os.js +45 -0
  640. package/dist/substrate/lifo/node-compat/path.d.ts +86 -0
  641. package/dist/substrate/lifo/node-compat/path.d.ts.map +1 -0
  642. package/dist/substrate/lifo/node-compat/path.js +49 -0
  643. package/dist/substrate/lifo/node-compat/process.d.ts +127 -0
  644. package/dist/substrate/lifo/node-compat/process.d.ts.map +1 -0
  645. package/dist/substrate/lifo/node-compat/process.js +173 -0
  646. package/dist/substrate/lifo/node-compat/readline.d.ts +85 -0
  647. package/dist/substrate/lifo/node-compat/readline.d.ts.map +1 -0
  648. package/dist/substrate/lifo/node-compat/readline.js +205 -0
  649. package/dist/substrate/lifo/node-compat/rimraf.d.ts +30 -0
  650. package/dist/substrate/lifo/node-compat/rimraf.d.ts.map +1 -0
  651. package/dist/substrate/lifo/node-compat/rimraf.js +63 -0
  652. package/dist/substrate/lifo/node-compat/stream.d.ts +36 -0
  653. package/dist/substrate/lifo/node-compat/stream.d.ts.map +1 -0
  654. package/dist/substrate/lifo/node-compat/stream.js +90 -0
  655. package/dist/substrate/lifo/node-compat/string_decoder.d.ts +11 -0
  656. package/dist/substrate/lifo/node-compat/string_decoder.d.ts.map +1 -0
  657. package/dist/substrate/lifo/node-compat/string_decoder.js +23 -0
  658. package/dist/substrate/lifo/node-compat/timers.d.ts +16 -0
  659. package/dist/substrate/lifo/node-compat/timers.d.ts.map +1 -0
  660. package/dist/substrate/lifo/node-compat/timers.js +18 -0
  661. package/dist/substrate/lifo/node-compat/tty.d.ts +32 -0
  662. package/dist/substrate/lifo/node-compat/tty.d.ts.map +1 -0
  663. package/dist/substrate/lifo/node-compat/tty.js +76 -0
  664. package/dist/substrate/lifo/node-compat/url.d.ts +37 -0
  665. package/dist/substrate/lifo/node-compat/url.d.ts.map +1 -0
  666. package/dist/substrate/lifo/node-compat/url.js +65 -0
  667. package/dist/substrate/lifo/node-compat/util.d.ts +42 -0
  668. package/dist/substrate/lifo/node-compat/util.d.ts.map +1 -0
  669. package/dist/substrate/lifo/node-compat/util.js +132 -0
  670. package/dist/substrate/lifo/node-compat/zlib.d.ts +66 -0
  671. package/dist/substrate/lifo/node-compat/zlib.d.ts.map +1 -0
  672. package/dist/substrate/lifo/node-compat/zlib.js +80 -0
  673. package/dist/substrate/lifo/pkg/PackageManager.d.ts +19 -0
  674. package/dist/substrate/lifo/pkg/PackageManager.d.ts.map +1 -0
  675. package/dist/substrate/lifo/pkg/PackageManager.js +97 -0
  676. package/dist/substrate/lifo/pkg/lifo-dev.d.ts +38 -0
  677. package/dist/substrate/lifo/pkg/lifo-dev.d.ts.map +1 -0
  678. package/dist/substrate/lifo/pkg/lifo-dev.js +98 -0
  679. package/dist/substrate/lifo/pkg/lifo-runtime.d.ts +44 -0
  680. package/dist/substrate/lifo/pkg/lifo-runtime.d.ts.map +1 -0
  681. package/dist/substrate/lifo/pkg/lifo-runtime.js +372 -0
  682. package/dist/substrate/lifo/pkg/loader.d.ts +4 -0
  683. package/dist/substrate/lifo/pkg/loader.d.ts.map +1 -0
  684. package/dist/substrate/lifo/pkg/loader.js +24 -0
  685. package/dist/substrate/lifo/sandbox/HeadlessTerminal.d.ts +18 -0
  686. package/dist/substrate/lifo/sandbox/HeadlessTerminal.d.ts.map +1 -0
  687. package/dist/substrate/lifo/sandbox/HeadlessTerminal.js +28 -0
  688. package/dist/substrate/lifo/sandbox/Sandbox.d.ts +59 -0
  689. package/dist/substrate/lifo/sandbox/Sandbox.d.ts.map +1 -0
  690. package/dist/substrate/lifo/sandbox/Sandbox.js +234 -0
  691. package/dist/substrate/lifo/sandbox/SandboxCommands.d.ts +18 -0
  692. package/dist/substrate/lifo/sandbox/SandboxCommands.d.ts.map +1 -0
  693. package/dist/substrate/lifo/sandbox/SandboxCommands.js +64 -0
  694. package/dist/substrate/lifo/sandbox/SandboxFs.d.ts +43 -0
  695. package/dist/substrate/lifo/sandbox/SandboxFs.d.ts.map +1 -0
  696. package/dist/substrate/lifo/sandbox/SandboxFs.js +136 -0
  697. package/dist/substrate/lifo/sandbox/index.d.ts +3 -0
  698. package/dist/substrate/lifo/sandbox/index.d.ts.map +1 -0
  699. package/dist/substrate/lifo/sandbox/index.js +1 -0
  700. package/dist/substrate/lifo/sandbox/types.d.ts +116 -0
  701. package/dist/substrate/lifo/sandbox/types.d.ts.map +1 -0
  702. package/dist/substrate/lifo/sandbox/types.js +1 -0
  703. package/dist/substrate/lifo/shell/ProcessRegistry.d.ts +142 -0
  704. package/dist/substrate/lifo/shell/ProcessRegistry.d.ts.map +1 -0
  705. package/dist/substrate/lifo/shell/ProcessRegistry.js +256 -0
  706. package/dist/substrate/lifo/shell/Shell.d.ts +170 -0
  707. package/dist/substrate/lifo/shell/Shell.d.ts.map +1 -0
  708. package/dist/substrate/lifo/shell/Shell.js +1863 -0
  709. package/dist/substrate/lifo/shell/completer.d.ts +19 -0
  710. package/dist/substrate/lifo/shell/completer.d.ts.map +1 -0
  711. package/dist/substrate/lifo/shell/completer.js +164 -0
  712. package/dist/substrate/lifo/shell/default-shell.d.ts +9 -0
  713. package/dist/substrate/lifo/shell/default-shell.d.ts.map +1 -0
  714. package/dist/substrate/lifo/shell/default-shell.js +53 -0
  715. package/dist/substrate/lifo/shell/expander.d.ts +48 -0
  716. package/dist/substrate/lifo/shell/expander.d.ts.map +1 -0
  717. package/dist/substrate/lifo/shell/expander.js +1204 -0
  718. package/dist/substrate/lifo/shell/history.d.ts +22 -0
  719. package/dist/substrate/lifo/shell/history.d.ts.map +1 -0
  720. package/dist/substrate/lifo/shell/history.js +121 -0
  721. package/dist/substrate/lifo/shell/interpreter.d.ts +257 -0
  722. package/dist/substrate/lifo/shell/interpreter.d.ts.map +1 -0
  723. package/dist/substrate/lifo/shell/interpreter.js +1490 -0
  724. package/dist/substrate/lifo/shell/jobs.d.ts +21 -0
  725. package/dist/substrate/lifo/shell/jobs.d.ts.map +1 -0
  726. package/dist/substrate/lifo/shell/jobs.js +48 -0
  727. package/dist/substrate/lifo/shell/lexer.d.ts +13 -0
  728. package/dist/substrate/lifo/shell/lexer.d.ts.map +1 -0
  729. package/dist/substrate/lifo/shell/lexer.js +614 -0
  730. package/dist/substrate/lifo/shell/parser.d.ts +7 -0
  731. package/dist/substrate/lifo/shell/parser.d.ts.map +1 -0
  732. package/dist/substrate/lifo/shell/parser.js +573 -0
  733. package/dist/substrate/lifo/shell/pipe.d.ts +15 -0
  734. package/dist/substrate/lifo/shell/pipe.d.ts.map +1 -0
  735. package/dist/substrate/lifo/shell/pipe.js +86 -0
  736. package/dist/substrate/lifo/shell/signals.d.ts +11 -0
  737. package/dist/substrate/lifo/shell/signals.d.ts.map +1 -0
  738. package/dist/substrate/lifo/shell/signals.js +57 -0
  739. package/dist/substrate/lifo/shell/terminal-stdin.d.ts +28 -0
  740. package/dist/substrate/lifo/shell/terminal-stdin.d.ts.map +1 -0
  741. package/dist/substrate/lifo/shell/terminal-stdin.js +100 -0
  742. package/dist/substrate/lifo/shell/test-builtin.d.ts +16 -0
  743. package/dist/substrate/lifo/shell/test-builtin.d.ts.map +1 -0
  744. package/dist/substrate/lifo/shell/test-builtin.js +237 -0
  745. package/dist/substrate/lifo/shell/types.d.ts +140 -0
  746. package/dist/substrate/lifo/shell/types.d.ts.map +1 -0
  747. package/dist/substrate/lifo/shell/types.js +25 -0
  748. package/dist/substrate/lifo/terminal/ITerminal.d.ts +10 -0
  749. package/dist/substrate/lifo/terminal/ITerminal.d.ts.map +1 -0
  750. package/dist/substrate/lifo/terminal/ITerminal.js +1 -0
  751. package/dist/substrate/lifo/utils/archive.d.ts +28 -0
  752. package/dist/substrate/lifo/utils/archive.d.ts.map +1 -0
  753. package/dist/substrate/lifo/utils/archive.js +323 -0
  754. package/dist/substrate/lifo/utils/args.d.ts +18 -0
  755. package/dist/substrate/lifo/utils/args.d.ts.map +1 -0
  756. package/dist/substrate/lifo/utils/args.js +73 -0
  757. package/dist/substrate/lifo/utils/colors.d.ts +27 -0
  758. package/dist/substrate/lifo/utils/colors.d.ts.map +1 -0
  759. package/dist/substrate/lifo/utils/colors.js +26 -0
  760. package/dist/substrate/lifo/utils/encoding.d.ts +4 -0
  761. package/dist/substrate/lifo/utils/encoding.d.ts.map +1 -0
  762. package/dist/substrate/lifo/utils/encoding.js +18 -0
  763. package/dist/substrate/lifo/utils/glob.d.ts +12 -0
  764. package/dist/substrate/lifo/utils/glob.d.ts.map +1 -0
  765. package/dist/substrate/lifo/utils/glob.js +150 -0
  766. package/dist/substrate/lifo/utils/mime.d.ts +4 -0
  767. package/dist/substrate/lifo/utils/mime.d.ts.map +1 -0
  768. package/dist/substrate/lifo/utils/mime.js +107 -0
  769. package/dist/substrate/lifo/utils/path.d.ts +12 -0
  770. package/dist/substrate/lifo/utils/path.d.ts.map +1 -0
  771. package/dist/substrate/lifo/utils/path.js +82 -0
  772. package/dist/vfs/events.d.ts +51 -0
  773. package/dist/vfs/events.d.ts.map +1 -0
  774. package/dist/vfs/events.js +127 -0
  775. package/dist/vfs/path.d.ts +46 -0
  776. package/dist/vfs/path.d.ts.map +1 -0
  777. package/dist/vfs/path.js +69 -0
  778. package/dist/vfs/seed-project.d.ts +62 -0
  779. package/dist/vfs/seed-project.d.ts.map +1 -0
  780. package/dist/vfs/seed-project.js +1054 -0
  781. package/dist/vfs/sqlite-vfs.d.ts +821 -0
  782. package/dist/vfs/sqlite-vfs.d.ts.map +1 -0
  783. package/dist/vfs/sqlite-vfs.js +4135 -0
  784. package/dist/vfs/symlink-registry.d.ts +60 -0
  785. package/dist/vfs/symlink-registry.d.ts.map +1 -0
  786. package/dist/vfs/symlink-registry.js +162 -0
  787. package/dist/workspace/nimbus-workspace.d.ts +94 -0
  788. package/dist/workspace/nimbus-workspace.d.ts.map +1 -0
  789. package/dist/workspace/nimbus-workspace.js +167 -0
  790. package/package.json +69 -0
  791. package/src/_shared/ai-egress.ts +91 -0
  792. package/src/_shared/byte-stream.ts +97 -0
  793. package/src/_shared/bytes.ts +19 -0
  794. package/src/_shared/cache-stats.ts +231 -0
  795. package/src/_shared/crypto.ts +184 -0
  796. package/src/_shared/esbuild-facet-shim.ts +22 -0
  797. package/src/_shared/exports-resolver.ts +308 -0
  798. package/src/_shared/facet-vfs-cursor.ts +58 -0
  799. package/src/_shared/install-phase.ts +56 -0
  800. package/src/_shared/lru-map.ts +59 -0
  801. package/src/_shared/real-node-imports.ts +53 -0
  802. package/src/_shared/retry.ts +202 -0
  803. package/src/_shared/rpc-dispose.ts +31 -0
  804. package/src/_shared/terminal.ts +3 -0
  805. package/src/_shared/typescript-specifiers.ts +86 -0
  806. package/src/_shared/untrusted-request.ts +75 -0
  807. package/src/_shared/vfs-write-ledger.ts +440 -0
  808. package/src/_shared/w7-frame.ts +1012 -0
  809. package/src/_shared/weighted-credit-pool.ts +244 -0
  810. package/src/constants.ts +285 -0
  811. package/src/index.ts +22 -0
  812. package/src/observability/diag-counters.ts +343 -0
  813. package/src/observability/heap-estimate.ts +331 -0
  814. package/src/observability/heavy-alloc-coord.ts +241 -0
  815. package/src/observability/oom-classify.ts +253 -0
  816. package/src/observability/oom-discriminator.ts +405 -0
  817. package/src/runtime/assets-loader.ts +189 -0
  818. package/src/runtime/barrel-detect.ts +69 -0
  819. package/src/runtime/bash/preamble.ts +1519 -0
  820. package/src/runtime/bash/types.ts +497 -0
  821. package/src/runtime/bundle-profile.ts +32 -0
  822. package/src/runtime/cirrus-vite-config-rewriter.ts +28 -0
  823. package/src/runtime/cli-flags.ts +11 -0
  824. package/src/runtime/comment-strip.ts +73 -0
  825. package/src/runtime/cpython-preamble.ts +298 -0
  826. package/src/runtime/esbuild-service.ts +1470 -0
  827. package/src/runtime/framework-detect.ts +245 -0
  828. package/src/runtime/import-meta-transform.ts +16 -0
  829. package/src/runtime/javascript-ast.ts +66 -0
  830. package/src/runtime/long-running-handle.ts +185 -0
  831. package/src/runtime/module-source-rewriter.ts +95 -0
  832. package/src/runtime/opentui-wasm-backend.ts +608 -0
  833. package/src/runtime/os-contracts.ts +529 -0
  834. package/src/runtime/port-registry.ts +298 -0
  835. package/src/runtime/process-input-routing.ts +92 -0
  836. package/src/runtime/process-input.ts +148 -0
  837. package/src/runtime/process-io-protocol.ts +97 -0
  838. package/src/runtime/process-logs.ts +882 -0
  839. package/src/runtime/process-table.ts +225 -0
  840. package/src/runtime/project-detect.ts +42 -0
  841. package/src/runtime/python-server-adapter.ts +133 -0
  842. package/src/runtime/require-resolver.ts +760 -0
  843. package/src/runtime/router-basename.ts +279 -0
  844. package/src/runtime/ruby-green-threads.ts +904 -0
  845. package/src/runtime/ruby-socket-shim.ts +548 -0
  846. package/src/runtime/session-process-supervisor.ts +323 -0
  847. package/src/runtime/sqlite-runtime-fs-bridge.ts +468 -0
  848. package/src/runtime/streams.ts +547 -0
  849. package/src/runtime/undici-shim.ts +517 -0
  850. package/src/runtime/vfs-manifest.ts +170 -0
  851. package/src/runtime/vfs-snapshot.ts +273 -0
  852. package/src/runtime/virtual-socket-kernel.ts +1370 -0
  853. package/src/runtime/vite-config-parser.ts +273 -0
  854. package/src/runtime/wasi/types.ts +448 -0
  855. package/src/runtime/wasi-instance.generated.ts +14 -0
  856. package/src/runtime/wasi-instance.ts +259 -0
  857. package/src/runtime/wasi-threads.ts +682 -0
  858. package/src/runtime/wasm-memory.ts +261 -0
  859. package/src/shell/elevation-commands.ts +117 -0
  860. package/src/shell/exec-dispatch.ts +201 -0
  861. package/src/shell/features.ts +870 -0
  862. package/src/shell/shell-entrypoints.ts +323 -0
  863. package/src/shell/shell-invocation.ts +181 -0
  864. package/src/shell/unix-accounts.ts +128 -0
  865. package/src/shell/unix-commands.ts +4335 -0
  866. package/src/substrate/lifo/UPSTREAM.md +14 -0
  867. package/src/substrate/lifo/commands/archive/gunzip.ts +63 -0
  868. package/src/substrate/lifo/commands/archive/gzip.ts +76 -0
  869. package/src/substrate/lifo/commands/archive/tar.ts +157 -0
  870. package/src/substrate/lifo/commands/archive/unzip.ts +112 -0
  871. package/src/substrate/lifo/commands/archive/zip.ts +70 -0
  872. package/src/substrate/lifo/commands/fs/basename.ts +16 -0
  873. package/src/substrate/lifo/commands/fs/cat.ts +54 -0
  874. package/src/substrate/lifo/commands/fs/chmod.ts +110 -0
  875. package/src/substrate/lifo/commands/fs/chown.ts +45 -0
  876. package/src/substrate/lifo/commands/fs/cp.ts +33 -0
  877. package/src/substrate/lifo/commands/fs/df.ts +56 -0
  878. package/src/substrate/lifo/commands/fs/dirname.ts +16 -0
  879. package/src/substrate/lifo/commands/fs/du.ts +100 -0
  880. package/src/substrate/lifo/commands/fs/file.ts +90 -0
  881. package/src/substrate/lifo/commands/fs/find.ts +76 -0
  882. package/src/substrate/lifo/commands/fs/ln.ts +19 -0
  883. package/src/substrate/lifo/commands/fs/ls.ts +164 -0
  884. package/src/substrate/lifo/commands/fs/mkdir.ts +37 -0
  885. package/src/substrate/lifo/commands/fs/mktemp.ts +56 -0
  886. package/src/substrate/lifo/commands/fs/mv.ts +111 -0
  887. package/src/substrate/lifo/commands/fs/realpath.ts +31 -0
  888. package/src/substrate/lifo/commands/fs/rm.ts +53 -0
  889. package/src/substrate/lifo/commands/fs/rmdir.ts +50 -0
  890. package/src/substrate/lifo/commands/fs/stat.ts +39 -0
  891. package/src/substrate/lifo/commands/fs/touch.ts +30 -0
  892. package/src/substrate/lifo/commands/fs/tree.ts +76 -0
  893. package/src/substrate/lifo/commands/index.ts +2 -0
  894. package/src/substrate/lifo/commands/io/dd.ts +289 -0
  895. package/src/substrate/lifo/commands/io/printf.ts +78 -0
  896. package/src/substrate/lifo/commands/io/tee.ts +37 -0
  897. package/src/substrate/lifo/commands/io/xargs.ts +49 -0
  898. package/src/substrate/lifo/commands/io/yes.ts +15 -0
  899. package/src/substrate/lifo/commands/net/curl.ts +739 -0
  900. package/src/substrate/lifo/commands/net/dig.ts +99 -0
  901. package/src/substrate/lifo/commands/net/forward.ts +90 -0
  902. package/src/substrate/lifo/commands/net/host.ts +182 -0
  903. package/src/substrate/lifo/commands/net/ifconfig.ts +139 -0
  904. package/src/substrate/lifo/commands/net/ip.ts +633 -0
  905. package/src/substrate/lifo/commands/net/netstat.ts +106 -0
  906. package/src/substrate/lifo/commands/net/ping.ts +74 -0
  907. package/src/substrate/lifo/commands/net/ports.ts +45 -0
  908. package/src/substrate/lifo/commands/net/route.ts +153 -0
  909. package/src/substrate/lifo/commands/net/tunnel-v2.ts +183 -0
  910. package/src/substrate/lifo/commands/net/tunnel.ts +272 -0
  911. package/src/substrate/lifo/commands/net/wget.ts +88 -0
  912. package/src/substrate/lifo/commands/registry.ts +141 -0
  913. package/src/substrate/lifo/commands/signal.ts +65 -0
  914. package/src/substrate/lifo/commands/system/bc.ts +265 -0
  915. package/src/substrate/lifo/commands/system/cal.ts +90 -0
  916. package/src/substrate/lifo/commands/system/date.ts +59 -0
  917. package/src/substrate/lifo/commands/system/env.ts +10 -0
  918. package/src/substrate/lifo/commands/system/fastfetch.ts +428 -0
  919. package/src/substrate/lifo/commands/system/free.ts +38 -0
  920. package/src/substrate/lifo/commands/system/help.ts +53 -0
  921. package/src/substrate/lifo/commands/system/hostname.ts +9 -0
  922. package/src/substrate/lifo/commands/system/kill.ts +89 -0
  923. package/src/substrate/lifo/commands/system/lifo.ts +525 -0
  924. package/src/substrate/lifo/commands/system/logout.ts +17 -0
  925. package/src/substrate/lifo/commands/system/man.ts +167 -0
  926. package/src/substrate/lifo/commands/system/node.ts +1305 -0
  927. package/src/substrate/lifo/commands/system/npm.ts +1078 -0
  928. package/src/substrate/lifo/commands/system/pkg.ts +111 -0
  929. package/src/substrate/lifo/commands/system/ps.ts +46 -0
  930. package/src/substrate/lifo/commands/system/registry-schemas.ts +33 -0
  931. package/src/substrate/lifo/commands/system/sha256sum.ts +89 -0
  932. package/src/substrate/lifo/commands/system/sl.ts +249 -0
  933. package/src/substrate/lifo/commands/system/sleep.ts +36 -0
  934. package/src/substrate/lifo/commands/system/stty.ts +69 -0
  935. package/src/substrate/lifo/commands/system/systemctl.ts +184 -0
  936. package/src/substrate/lifo/commands/system/top.ts +53 -0
  937. package/src/substrate/lifo/commands/system/uname.ts +59 -0
  938. package/src/substrate/lifo/commands/system/uptime.ts +19 -0
  939. package/src/substrate/lifo/commands/system/watch.ts +67 -0
  940. package/src/substrate/lifo/commands/system/which.ts +51 -0
  941. package/src/substrate/lifo/commands/system/whoami.ts +9 -0
  942. package/src/substrate/lifo/commands/text/awk.ts +210 -0
  943. package/src/substrate/lifo/commands/text/base64.ts +102 -0
  944. package/src/substrate/lifo/commands/text/cut.ts +92 -0
  945. package/src/substrate/lifo/commands/text/diff.ts +314 -0
  946. package/src/substrate/lifo/commands/text/grep.ts +170 -0
  947. package/src/substrate/lifo/commands/text/head.ts +95 -0
  948. package/src/substrate/lifo/commands/text/less.ts +335 -0
  949. package/src/substrate/lifo/commands/text/nano.ts +513 -0
  950. package/src/substrate/lifo/commands/text/nl.ts +74 -0
  951. package/src/substrate/lifo/commands/text/rev.ts +46 -0
  952. package/src/substrate/lifo/commands/text/sed.ts +297 -0
  953. package/src/substrate/lifo/commands/text/seq.ts +76 -0
  954. package/src/substrate/lifo/commands/text/sort.ts +88 -0
  955. package/src/substrate/lifo/commands/text/strings.ts +73 -0
  956. package/src/substrate/lifo/commands/text/tac.ts +37 -0
  957. package/src/substrate/lifo/commands/text/tail.ts +63 -0
  958. package/src/substrate/lifo/commands/text/tr.ts +192 -0
  959. package/src/substrate/lifo/commands/text/uniq.ts +77 -0
  960. package/src/substrate/lifo/commands/text/wc.ts +104 -0
  961. package/src/substrate/lifo/commands/types.ts +58 -0
  962. package/src/substrate/lifo/index.ts +173 -0
  963. package/src/substrate/lifo/kernel/ServiceManager.ts +371 -0
  964. package/src/substrate/lifo/kernel/index.ts +209 -0
  965. package/src/substrate/lifo/kernel/network/Bridge.ts +336 -0
  966. package/src/substrate/lifo/kernel/network/DNSResolver.ts +158 -0
  967. package/src/substrate/lifo/kernel/network/NetworkInterface.ts +235 -0
  968. package/src/substrate/lifo/kernel/network/NetworkNamespace.ts +182 -0
  969. package/src/substrate/lifo/kernel/network/NetworkStack.ts +590 -0
  970. package/src/substrate/lifo/kernel/network/PortBridge.ts +182 -0
  971. package/src/substrate/lifo/kernel/network/RoutingTable.ts +209 -0
  972. package/src/substrate/lifo/kernel/network/Socket.ts +245 -0
  973. package/src/substrate/lifo/kernel/network/index.ts +29 -0
  974. package/src/substrate/lifo/kernel/network/tunnel/BaseTunnel.ts +124 -0
  975. package/src/substrate/lifo/kernel/network/tunnel/VETHPair.ts +227 -0
  976. package/src/substrate/lifo/kernel/network/tunnel/WebSocketTunnel.ts +387 -0
  977. package/src/substrate/lifo/kernel/network/types.ts +178 -0
  978. package/src/substrate/lifo/kernel/persistence/PersistenceManager.ts +50 -0
  979. package/src/substrate/lifo/kernel/persistence/backends.ts +36 -0
  980. package/src/substrate/lifo/kernel/persistence/index.ts +5 -0
  981. package/src/substrate/lifo/kernel/persistence/serializer.ts +127 -0
  982. package/src/substrate/lifo/kernel/samples.ts +966 -0
  983. package/src/substrate/lifo/kernel/storage/BlobStore.ts +114 -0
  984. package/src/substrate/lifo/kernel/storage/ContentStore.ts +150 -0
  985. package/src/substrate/lifo/kernel/storage/index.ts +5 -0
  986. package/src/substrate/lifo/kernel/unit-parser.ts +95 -0
  987. package/src/substrate/lifo/kernel/vfs/VFS.ts +768 -0
  988. package/src/substrate/lifo/kernel/vfs/index.ts +9 -0
  989. package/src/substrate/lifo/kernel/vfs/providers/DevProvider.ts +172 -0
  990. package/src/substrate/lifo/kernel/vfs/providers/NativeFsProvider.ts +198 -0
  991. package/src/substrate/lifo/kernel/vfs/providers/ProcProvider.ts +144 -0
  992. package/src/substrate/lifo/kernel/vfs/types.ts +145 -0
  993. package/src/substrate/lifo/node-compat/buffer.ts +357 -0
  994. package/src/substrate/lifo/node-compat/child_process.ts +52 -0
  995. package/src/substrate/lifo/node-compat/console.ts +70 -0
  996. package/src/substrate/lifo/node-compat/crypto.ts +186 -0
  997. package/src/substrate/lifo/node-compat/dns.ts +214 -0
  998. package/src/substrate/lifo/node-compat/esbuild.ts +85 -0
  999. package/src/substrate/lifo/node-compat/events.ts +94 -0
  1000. package/src/substrate/lifo/node-compat/fs.ts +762 -0
  1001. package/src/substrate/lifo/node-compat/http.ts +561 -0
  1002. package/src/substrate/lifo/node-compat/index.ts +300 -0
  1003. package/src/substrate/lifo/node-compat/module.ts +148 -0
  1004. package/src/substrate/lifo/node-compat/os.ts +44 -0
  1005. package/src/substrate/lifo/node-compat/path.ts +74 -0
  1006. package/src/substrate/lifo/node-compat/process.ts +178 -0
  1007. package/src/substrate/lifo/node-compat/readline.ts +244 -0
  1008. package/src/substrate/lifo/node-compat/rimraf.ts +80 -0
  1009. package/src/substrate/lifo/node-compat/stream.ts +98 -0
  1010. package/src/substrate/lifo/node-compat/string_decoder.ts +26 -0
  1011. package/src/substrate/lifo/node-compat/timers.ts +21 -0
  1012. package/src/substrate/lifo/node-compat/tty.ts +83 -0
  1013. package/src/substrate/lifo/node-compat/url.ts +76 -0
  1014. package/src/substrate/lifo/node-compat/util.ts +133 -0
  1015. package/src/substrate/lifo/node-compat/zlib.ts +94 -0
  1016. package/src/substrate/lifo/pkg/PackageManager.ts +105 -0
  1017. package/src/substrate/lifo/pkg/lifo-dev.ts +130 -0
  1018. package/src/substrate/lifo/pkg/lifo-runtime.ts +473 -0
  1019. package/src/substrate/lifo/pkg/loader.ts +33 -0
  1020. package/src/substrate/lifo/platform-globals.d.ts +41 -0
  1021. package/src/substrate/lifo/sandbox/HeadlessTerminal.ts +38 -0
  1022. package/src/substrate/lifo/sandbox/Sandbox.ts +279 -0
  1023. package/src/substrate/lifo/sandbox/SandboxCommands.ts +74 -0
  1024. package/src/substrate/lifo/sandbox/SandboxFs.ts +160 -0
  1025. package/src/substrate/lifo/sandbox/index.ts +8 -0
  1026. package/src/substrate/lifo/sandbox/types.ts +117 -0
  1027. package/src/substrate/lifo/shell/ProcessRegistry.ts +379 -0
  1028. package/src/substrate/lifo/shell/Shell.ts +2048 -0
  1029. package/src/substrate/lifo/shell/completer.ts +212 -0
  1030. package/src/substrate/lifo/shell/default-shell.ts +63 -0
  1031. package/src/substrate/lifo/shell/expander.ts +1349 -0
  1032. package/src/substrate/lifo/shell/history.ts +138 -0
  1033. package/src/substrate/lifo/shell/interpreter.ts +1754 -0
  1034. package/src/substrate/lifo/shell/jobs.ts +64 -0
  1035. package/src/substrate/lifo/shell/lexer.ts +698 -0
  1036. package/src/substrate/lifo/shell/parser.ts +711 -0
  1037. package/src/substrate/lifo/shell/pipe.ts +92 -0
  1038. package/src/substrate/lifo/shell/signals.ts +70 -0
  1039. package/src/substrate/lifo/shell/terminal-stdin.ts +109 -0
  1040. package/src/substrate/lifo/shell/test-builtin.ts +316 -0
  1041. package/src/substrate/lifo/shell/types.ts +166 -0
  1042. package/src/substrate/lifo/terminal/ITerminal.ts +9 -0
  1043. package/src/substrate/lifo/utils/archive.ts +389 -0
  1044. package/src/substrate/lifo/utils/args.ts +89 -0
  1045. package/src/substrate/lifo/utils/colors.ts +29 -0
  1046. package/src/substrate/lifo/utils/encoding.ts +21 -0
  1047. package/src/substrate/lifo/utils/glob.ts +172 -0
  1048. package/src/substrate/lifo/utils/mime.ts +114 -0
  1049. package/src/substrate/lifo/utils/path.ts +83 -0
  1050. package/src/types/assets.d.ts +4 -0
  1051. package/src/vfs/events.ts +134 -0
  1052. package/src/vfs/path.ts +71 -0
  1053. package/src/vfs/seed-project.ts +1094 -0
  1054. package/src/vfs/sqlite-vfs.ts +5035 -0
  1055. package/src/vfs/symlink-registry.ts +172 -0
  1056. package/src/workspace/nimbus-workspace.ts +213 -0
@@ -0,0 +1,1849 @@
1
+ const PAGE = 65536, te = new TextEncoder(), td = new TextDecoder();
2
+ // Sizing is measurement-grounded (local pre-gate stats): bash's deepest
3
+ // observed asyncify capture is ~25 KiB (full control suite), so 8 MiB
4
+ // main / 256 KiB slots carry 300×/10× margin while keeping a full
5
+ // instance ~17 MiB — several forks fit the ~180-200 MiB facet ceiling.
6
+ const MAIN_SIZE = 8 << 20, SLOT_SIZE = 256 << 10, NSLOT = 32;
7
+ const E = { ACCES: 2, BADF: 8, EXIST: 20, INVAL: 28, ISDIR: 31, LOOP: 32, NOENT: 44, NOSYS: 52, NOTDIR: 54, NOTEMPTY: 55, PERM: 63, SPIPE: 70 };
8
+ // WASI clock ids. MONOTONIC and the two CPUTIME clocks are answered from a
9
+ // monotonic source; an id outside this set is EINVAL, never a silent realtime
10
+ // reading — a guest that asks for monotonic and receives wall time computes
11
+ // negative durations the first time the wall clock steps backwards.
12
+ const CLOCK_REALTIME = 0, CLOCK_MONOTONIC = 1, CLOCK_PROCESS_CPUTIME = 2, CLOCK_THREAD_CPUTIME = 3;
13
+ function realtimeNs() { return BigInt(Date.now()) * 1000000n; }
14
+ function monotonicNs() {
15
+ const ms = (typeof performance !== 'undefined' && performance.now) ? performance.now() : Date.now();
16
+ return BigInt(Math.floor(ms * 1000)) * 1000n;
17
+ }
18
+ // null for an unknown id, so callers answer EINVAL rather than inventing a time.
19
+ function clockNs(id) {
20
+ if (id === CLOCK_REALTIME)
21
+ return realtimeNs();
22
+ if (id === CLOCK_MONOTONIC || id === CLOCK_PROCESS_CPUTIME || id === CLOCK_THREAD_CPUTIME)
23
+ return monotonicNs();
24
+ return null;
25
+ }
26
+ class Exit {
27
+ constructor(c) { this.code = c; }
28
+ }
29
+ let S = null; // active session state; persists across submits on the warm isolate
30
+ function norm(p) {
31
+ const parts = [];
32
+ for (const seg of String(p).split('/')) {
33
+ if (!seg || seg === '.')
34
+ continue;
35
+ if (seg === '..') {
36
+ parts.pop();
37
+ continue;
38
+ }
39
+ parts.push(seg);
40
+ }
41
+ return parts.join('/');
42
+ }
43
+ function b64ToBytes(b64) {
44
+ const bin = atob(b64);
45
+ const out = new Uint8Array(bin.length);
46
+ for (let i = 0; i < bin.length; i++)
47
+ out[i] = bin.charCodeAt(i);
48
+ return out;
49
+ }
50
+ function bytesToB64(bytes) {
51
+ let bin = '';
52
+ const CH = 0x8000;
53
+ for (let i = 0; i < bytes.length; i += CH)
54
+ bin += String.fromCharCode.apply(null, bytes.subarray(i, i + CH));
55
+ return btoa(bin);
56
+ }
57
+ function newSession(args) {
58
+ const wasmTable = globalThis.__NIMBUS_WASM || {};
59
+ const mod = wasmTable['bash.async.wasm'];
60
+ if (!mod)
61
+ throw new Error('bash.async.wasm missing from __NIMBUS_WASM');
62
+ const coreutils = new Map();
63
+ for (const key of Object.keys(wasmTable)) {
64
+ if (key.startsWith('cu_') && key.endsWith('.wasm'))
65
+ coreutils.set(key.slice(3, -5), wasmTable[key]);
66
+ }
67
+ // Applet aliasing: ONE staged busybox module answers to every applet
68
+ // name (busybox dispatches on argv[0]), so bash's PATH lookup finds
69
+ // ls/cat/grep/... as executables in /bin.
70
+ const busybox = wasmTable['cu_busybox.wasm'];
71
+ if (busybox)
72
+ for (const name of args.busyboxApplets || [])
73
+ coreutils.set(name, busybox);
74
+ const fs = {
75
+ files: new Map(), dirs: new Set(), modes: new Map(),
76
+ written: new Set(), deleted: new Set(),
77
+ dirsCreated: new Set(), dirsDeleted: new Set(), modesChanged: new Map(),
78
+ // vfsPath → mtime ns. The snapshot carries no times, so an inode the
79
+ // session did not touch reports sessionNs: older than anything written
80
+ // here, which is what makes 'is the target newer than its source' — the
81
+ // question make(1) and every incremental build asks — answerable.
82
+ times: new Map(), sessionNs: realtimeNs(),
83
+ // vfsPath → target string, stored verbatim per POSIX: a symlink is a dumb
84
+ // string resolved at lookup time, not a pointer to an inode.
85
+ symlinks: new Map(), symlinksCreated: new Map(),
86
+ };
87
+ const snap = args.fsSnapshot || { files: {}, dirs: [], modes: {} };
88
+ for (const [path, b64] of Object.entries(snap.files || {}))
89
+ fs.files.set(norm(path), { bytes: b64ToBytes(b64) });
90
+ for (const d of snap.dirs || [])
91
+ fs.dirs.add(norm(d));
92
+ // The snapshot's modes are the S2a projection: effective rwx per path
93
+ // for the invoking credential. Enforced by the WASI layer below.
94
+ for (const [path, m] of Object.entries(snap.modes || {}))
95
+ fs.modes.set(norm(path), Number(m) & 7);
96
+ for (const seed of ['etc', 'dev', 'bin', 'usr', 'usr/bin']) {
97
+ fs.dirs.add(seed);
98
+ if (!fs.modes.has(seed))
99
+ fs.modes.set(seed, 5);
100
+ }
101
+ // Startup rc: chdir to the session cwd (wasi-libc cwd starts at '/').
102
+ // BASH_ENV points here for non-interactive shells; interactive shells
103
+ // read ~/.bashrc, which is seeded to source this file when absent.
104
+ if (!fs.files.has('etc/nimbus.bashrc')) {
105
+ fs.files.set('etc/nimbus.bashrc', { bytes: te.encode('command cd "$' + '{NIMBUS_PWD:-/}" 2>/dev/null\n') });
106
+ fs.modes.set('etc/nimbus.bashrc', 4);
107
+ }
108
+ const home = norm((args.environ.find((e) => e.startsWith('HOME=')) || 'HOME=/home/user').slice(5));
109
+ if (args.stdinTty && home && !fs.files.has(home + '/.bashrc')) {
110
+ fs.files.set(home + '/.bashrc', { bytes: te.encode('. /etc/nimbus.bashrc\n') });
111
+ if (!fs.modes.has(home + '/.bashrc'))
112
+ fs.modes.set(home + '/.bashrc', 6);
113
+ }
114
+ const cwd = norm((args.environ.find((e) => e.startsWith('NIMBUS_PWD=')) || 'NIMBUS_PWD=/').slice(11));
115
+ return {
116
+ mod, coreutils, fs, cwd,
117
+ argv: args.argv, environ: args.environ,
118
+ stdinTty: !!args.stdinTty,
119
+ stdin: { chunks: args.stdinData ? [te.encode(args.stdinData)] : [], queued: 0, closed: !!args.stdinClosed, waiters: [] },
120
+ procs: new Map(), pipes: new Map(), runnable: [], exitStatus: new Map(), waiters: [],
121
+ pidNext: 100, pipeNext: 1, rootPid: 0, rootExit: null, steps: 0,
122
+ out: '', err: '',
123
+ missingWasi: new Set(),
124
+ stats: { instances: 0, memPeak: 0, mainHi: 0, slotHi: 0 },
125
+ error: null,
126
+ };
127
+ }
128
+ function initStdinQueued(s) { s.stdin.queued = s.stdin.chunks.reduce((a, c) => a + c.length, 0); }
129
+ function newPipe(s) { const id = s.pipeNext++; s.pipes.set(id, { chunks: [], queued: 0, readers: 1, writers: 1, readW: [] }); return id; }
130
+ // fd 3 is the wasi-libc '/' preopen. It lives in the fd table as a
131
+ // real 'preopen' entry: wasi-libc's path ops fd_fdstat_get the dirfd
132
+ // to compute inherited rights, so it must answer (not EBADF), and
133
+ // lowestFd must never re-issue it for a regular file.
134
+ function lowestFd(proc) { let fd = 0; while (proc.fds.has(fd) || fd === 3)
135
+ fd++; return fd; }
136
+ function bumpPipe(s, e, d) { const pp = s.pipes.get(e.pipeId); if (e.end === 'r')
137
+ pp.readers += d;
138
+ else
139
+ pp.writers += d; }
140
+ function closeFd(s, proc, fd) {
141
+ const e = proc.fds.get(fd);
142
+ if (!e)
143
+ return;
144
+ proc.fds.delete(fd);
145
+ if (e.kind === 'pipe') {
146
+ bumpPipe(s, e, -1);
147
+ wakePipe(s, s.pipes.get(e.pipeId));
148
+ }
149
+ }
150
+ function takeUpTo(src, max) {
151
+ let need = max;
152
+ const parts = [];
153
+ while (need > 0 && src.chunks.length) {
154
+ const ch = src.chunks[0];
155
+ if (ch.length <= need) {
156
+ parts.push(ch);
157
+ need -= ch.length;
158
+ src.chunks.shift();
159
+ }
160
+ else {
161
+ parts.push(ch.subarray(0, need));
162
+ src.chunks[0] = ch.subarray(need);
163
+ need = 0;
164
+ }
165
+ }
166
+ const total = max - need;
167
+ src.queued -= total;
168
+ const o = new Uint8Array(total);
169
+ let x = 0;
170
+ for (const p of parts) {
171
+ o.set(p, x);
172
+ x += p.length;
173
+ }
174
+ return o;
175
+ }
176
+ // POSIX readv is ONE read of up to the summed length, scattered across the
177
+ // buffers in order — not a read of the first buffer. Zero-length entries are
178
+ // dropped so they never terminate the scatter early.
179
+ // A poll park has no destination buffer — it resumes into a fresh poll call.
180
+ const EMPTY_IOV = { list: [], total: 0 };
181
+ function readIovs(dv, iovs, n) {
182
+ const list = [];
183
+ let total = 0;
184
+ for (let i = 0; i < n; i++) {
185
+ const ptr = dv.getUint32(iovs + i * 8, true), len = dv.getUint32(iovs + i * 8 + 4, true);
186
+ if (len > 0) {
187
+ list.push({ ptr, len });
188
+ total += len;
189
+ }
190
+ }
191
+ return { list, total };
192
+ }
193
+ function scatter(u8, iov, bytes) {
194
+ let off = 0;
195
+ for (const b of iov.list) {
196
+ if (off >= bytes.length)
197
+ break;
198
+ const n = Math.min(b.len, bytes.length - off);
199
+ u8.set(bytes.subarray(off, off + n), b.ptr);
200
+ off += n;
201
+ }
202
+ return off;
203
+ }
204
+ function wakePipe(s, pp) {
205
+ while (pp.readW.length && (pp.queued > 0 || pp.writers === 0)) {
206
+ const w = pp.readW.shift();
207
+ const proc = w.proc;
208
+ const req = proc.ctx.pipeReq;
209
+ const bytes = pp.queued > 0 ? takeUpTo(pp, req.iov.total) : new Uint8Array(0);
210
+ proc.pendingRead = { iov: req.iov, bytes, nreadPtr: req.nreadPtr, pollUserdata: req.pollUserdata };
211
+ resumeProc(proc);
212
+ }
213
+ }
214
+ function wakeStdin(s) {
215
+ const st = s.stdin;
216
+ while (st.waiters.length && (st.queued > 0 || st.closed)) {
217
+ const w = st.waiters.shift();
218
+ const proc = w.proc;
219
+ const req = proc.ctx.pipeReq;
220
+ const bytes = st.queued > 0 ? takeUpTo(st, req.iov.total) : new Uint8Array(0);
221
+ proc.pendingRead = { iov: req.iov, bytes, nreadPtr: req.nreadPtr, pollUserdata: req.pollUserdata };
222
+ resumeProc(proc);
223
+ }
224
+ }
225
+ // ── file layer ────────────────────────────────────────────────────────
226
+ function fileLookup(s, path) { return s.fs.files.get(path) || null; }
227
+ function isDir(s, path) { return path === '' || s.fs.dirs.has(path); }
228
+ function isCoreutil(s, path) {
229
+ if (!path.startsWith('bin/') && !path.startsWith('usr/bin/'))
230
+ return false;
231
+ return s.coreutils.has(path.split('/').pop());
232
+ }
233
+ // A modes-only inode is a file the snapshot could not read (S2a): it
234
+ // exists, its bytes are absent, and access answers with the real bits.
235
+ function fileExists(s, path) {
236
+ return s.fs.files.has(path) || (s.fs.modes.has(path) && !s.fs.dirs.has(path));
237
+ }
238
+ function inodeExists(s, path) {
239
+ return s.fs.files.has(path) || s.fs.dirs.has(path) || s.fs.modes.has(path);
240
+ }
241
+ // S2a effective-mode policy (mirrors the JSPI shim): a mapped mode wins;
242
+ // an inode that exists without one is denied; an absent path is free to
243
+ // create (the durable flush re-checks as the credential).
244
+ function effMode(s, path) {
245
+ if (path === '')
246
+ return 7;
247
+ const m = s.fs.modes.get(path);
248
+ if (m !== undefined)
249
+ return m;
250
+ if (isCoreutil(s, path))
251
+ return 5;
252
+ return inodeExists(s, path) ? 0 : 7;
253
+ }
254
+ function parentOf(path) { const i = path.lastIndexOf('/'); return i < 0 ? '' : path.slice(0, i); }
255
+ // Rewrite the leftmost symlink on the path and repeat, so both intermediate
256
+ // components and a terminal link resolve. A target starting with '/' is
257
+ // root-anchored; anything else is relative to the link's own directory.
258
+ // SYMLOOP_MAX bounds it — a cycle answers ELOOP rather than hanging.
259
+ function followPath(s, path) {
260
+ let cur = path;
261
+ for (let hops = 0; hops < 32; hops++) {
262
+ if (!s.fs.symlinks.size)
263
+ return { path: cur, errno: 0 };
264
+ const parts = cur.split('/');
265
+ let prefix = '';
266
+ let rewrote = false;
267
+ for (let i = 0; i < parts.length; i++) {
268
+ prefix = prefix ? prefix + '/' + parts[i] : parts[i];
269
+ const target = s.fs.symlinks.get(prefix);
270
+ if (target === undefined)
271
+ continue;
272
+ const base = target.startsWith('/') ? norm(target) : norm(parentOf(prefix) + '/' + target);
273
+ const rest = parts.slice(i + 1).join('/');
274
+ cur = rest ? norm(base + '/' + rest) : base;
275
+ rewrote = true;
276
+ break;
277
+ }
278
+ if (!rewrote)
279
+ return { path: cur, errno: 0 };
280
+ }
281
+ return { path: cur, errno: E.LOOP };
282
+ }
283
+ // Resolve only the directories leading to the final component. This is what
284
+ // the mutating ops want: rm dir/link must delete the link, not its target,
285
+ // while dir itself may still be reached through a link.
286
+ function followParents(s, path) {
287
+ const parent = parentOf(path);
288
+ if (!parent)
289
+ return { path, errno: 0 };
290
+ const r = followPath(s, parent);
291
+ if (r.errno)
292
+ return r;
293
+ const name = path.slice(parent.length + 1);
294
+ return { path: r.path ? r.path + '/' + name : name, errno: 0 };
295
+ }
296
+ // Every ancestor dir on the way to the target needs the search (x) bit.
297
+ function checkTraversal(s, path) {
298
+ const parts = path.split('/');
299
+ let anc = '';
300
+ for (let i = 0; i < parts.length - 1; i++) {
301
+ anc = anc ? anc + '/' + parts[i] : parts[i];
302
+ if (!isDir(s, anc))
303
+ return inodeExists(s, anc) ? E.NOTDIR : E.NOENT;
304
+ if ((effMode(s, anc) & 1) === 0)
305
+ return E.ACCES;
306
+ }
307
+ return 0;
308
+ }
309
+ function checkParentWritable(s, path) {
310
+ const parent = parentOf(path);
311
+ if (parent && (effMode(s, parent) & 3) !== 3)
312
+ return E.ACCES;
313
+ return 0;
314
+ }
315
+ function recordDirAdded(s, path) {
316
+ s.fs.dirs.add(path);
317
+ s.fs.dirsDeleted.delete(path);
318
+ s.fs.dirsCreated.add(path);
319
+ if (!s.fs.modes.has(path))
320
+ s.fs.modes.set(path, 7);
321
+ touchPath(s, path);
322
+ }
323
+ function recordDirRemoved(s, path) {
324
+ s.fs.dirs.delete(path);
325
+ s.fs.modes.delete(path);
326
+ s.fs.times.delete(path);
327
+ if (s.fs.dirsCreated.has(path))
328
+ s.fs.dirsCreated.delete(path);
329
+ else
330
+ s.fs.dirsDeleted.add(path);
331
+ }
332
+ function recordFileRemoved(s, path) {
333
+ s.fs.files.delete(path);
334
+ s.fs.written.delete(path);
335
+ s.fs.modes.delete(path);
336
+ s.fs.times.delete(path);
337
+ s.fs.symlinks.delete(path);
338
+ s.fs.symlinksCreated.delete(path);
339
+ s.fs.deleted.add(path);
340
+ }
341
+ function markWritten(s, path) {
342
+ s.fs.written.add(path);
343
+ s.fs.deleted.delete(path);
344
+ if (!s.fs.modes.has(path))
345
+ s.fs.modes.set(path, 6);
346
+ touchPath(s, path);
347
+ const parts = path.split('/');
348
+ for (let i = 1; i < parts.length; i++) {
349
+ const dir = parts.slice(0, i).join('/');
350
+ if (!s.fs.dirs.has(dir))
351
+ recordDirAdded(s, dir);
352
+ }
353
+ }
354
+ function fileWrite(s, entry, path, pos, bytes) {
355
+ const need = pos + bytes.length;
356
+ if (need > entry.bytes.length) {
357
+ const grown = new Uint8Array(need);
358
+ grown.set(entry.bytes);
359
+ entry.bytes = grown;
360
+ }
361
+ entry.bytes.set(bytes, pos);
362
+ markWritten(s, path);
363
+ }
364
+ function mtimeNs(s, path) {
365
+ const t = s.fs.times.get(path);
366
+ return t === undefined ? s.fs.sessionNs : t;
367
+ }
368
+ function touchPath(s, path) { s.fs.times.set(path, realtimeNs()); }
369
+ function statBuf(dv, u8, buf, filetype, size, timeNs) {
370
+ u8.fill(0, buf, buf + 64);
371
+ dv.setUint8(buf + 16, filetype);
372
+ dv.setBigUint64(buf + 24, 1n, true);
373
+ dv.setBigUint64(buf + 32, BigInt(size), true);
374
+ dv.setBigUint64(buf + 40, timeNs, true);
375
+ dv.setBigUint64(buf + 48, timeNs, true);
376
+ dv.setBigUint64(buf + 56, timeNs, true);
377
+ }
378
+ // Shared WASI surface over the process fd table + file layer. The io
379
+ // argument abstracts the blocking discipline: bash instances
380
+ // asyncify-park, exec'd plain-WASI tools synchronously pump the scheduler.
381
+ //
382
+ // pathBase (exec'd coreutils only) emulates the child's inherited cwd. An
383
+ // exec'd tool's wasi-libc has cwd '/', so it absolutizes BOTH its own
384
+ // relative args and absolute args against '/' — they reach path_open
385
+ // IDENTICALLY un-prefixed (e.g. 'ls tmp' and 'ls /tmp' both arrive 'tmp';
386
+ // 'ls' and 'ls /' both arrive ''). The lost absolute-vs-relative bit is
387
+ // recovered from absRoots: the normalized set of absolute argv paths bash
388
+ // passed the tool. A path that IS (or descends from) one of those is
389
+ // absolute-origin — the arriving string is already the correct
390
+ // root-relative target, so it is NEVER re-anchored. Everything else is
391
+ // relative-origin (a relative arg, or a child name synthesized while
392
+ // listing a directory): re-anchor against the inherited cwd, preferring
393
+ // the cwd-joined path, then the bare one, then whichever parent dir
394
+ // exists (touch newfile in the session cwd vs a '/'-listing's children).
395
+ function isUnderAbsRoot(p, absRoots) {
396
+ if (!absRoots)
397
+ return false;
398
+ for (const a of absRoots) {
399
+ if (p === a)
400
+ return true;
401
+ if (a !== '' && p.startsWith(a + '/'))
402
+ return true;
403
+ }
404
+ return false;
405
+ }
406
+ function makeResolve(s, pathBase, absRoots) {
407
+ return (raw) => {
408
+ const p = norm(raw);
409
+ if (!pathBase)
410
+ return p;
411
+ if (isUnderAbsRoot(p, absRoots))
412
+ return p;
413
+ const joined = norm(pathBase + '/' + p);
414
+ if (inodeExists(s, joined))
415
+ return joined;
416
+ if (inodeExists(s, p))
417
+ return p;
418
+ if (isDir(s, parentOf(joined)))
419
+ return joined;
420
+ if (isDir(s, parentOf(p)))
421
+ return p;
422
+ return joined;
423
+ };
424
+ }
425
+ // The rest of the preview1 surface. These are NOT stubs that claim success:
426
+ // each one either is genuinely a no-op on an in-memory filesystem, or answers
427
+ // ENOSYS. The old blanket fallback returned ESUCCESS for all of them without
428
+ // writing their out-params, so a guest read uninitialised memory and believed
429
+ // the call had worked — silent wrong data, the worst failure available.
430
+ function makeUnsupported(s) {
431
+ const nosys = (name) => () => { s.missingWasi.add(name); return E.NOSYS; };
432
+ return {
433
+ // Every write is already durable in the session's own heap, so there is
434
+ // nothing to flush and success is the honest answer.
435
+ fd_sync: () => 0,
436
+ fd_datasync: () => 0,
437
+ fd_advise: () => 0,
438
+ // One process runs at a time under this scheduler; a yield has nothing to
439
+ // yield to that the caller has not already reached.
440
+ sched_yield: () => 0,
441
+ fd_pread: nosys('fd_pread'),
442
+ fd_pwrite: nosys('fd_pwrite'),
443
+ fd_allocate: nosys('fd_allocate'),
444
+ fd_filestat_set_size: nosys('fd_filestat_set_size'),
445
+ fd_filestat_set_times: nosys('fd_filestat_set_times'),
446
+ fd_fdstat_set_rights: nosys('fd_fdstat_set_rights'),
447
+ proc_raise: nosys('proc_raise'),
448
+ sock_send: nosys('sock_send'),
449
+ sock_recv: nosys('sock_recv'),
450
+ sock_shutdown: nosys('sock_shutdown'),
451
+ };
452
+ }
453
+ function makeWasiFs(s, proc, DV, U8, io, pathBase, absRoots) {
454
+ const resolve = makeResolve(s, pathBase, absRoots);
455
+ return {
456
+ ...makeUnsupported(s),
457
+ fd_prestat_get: (fd, buf) => { if (fd === 3) {
458
+ DV().setUint8(buf, 0);
459
+ DV().setUint32(buf + 4, 1, true);
460
+ return 0;
461
+ } return E.BADF; },
462
+ // The buffer length is a contract, not decoration: fd_prestat_get reports
463
+ // the name is 1 byte, and a guest that offers less must not be written to.
464
+ fd_prestat_dir_name: (fd, path, plen) => {
465
+ if (fd !== 3)
466
+ return E.BADF;
467
+ if (plen < 1)
468
+ return E.INVAL;
469
+ U8()[path] = 0x2f;
470
+ return 0;
471
+ },
472
+ path_open: (dirfd, dirflags, pathPtr, pathLen, oflags, rightsBase, _ri, fdflags, retPtr) => {
473
+ const raw = resolve(td.decode(U8().subarray(pathPtr, pathPtr + pathLen)));
474
+ // SYMLINK_FOLLOW (lookupflags bit 0). Without it only the leading
475
+ // directories resolve, so O_NOFOLLOW opens the link itself.
476
+ const r = (dirflags & 1) !== 0 ? followPath(s, raw) : followParents(s, raw);
477
+ if (r.errno)
478
+ return r.errno;
479
+ const path = r.path;
480
+ const dv = DV();
481
+ if (path === 'dev/null' || path === 'dev/tty') {
482
+ const fd = lowestFd(proc);
483
+ proc.fds.set(fd, { kind: path === 'dev/tty' ? 'tty' : 'null' });
484
+ dv.setUint32(retPtr, fd, true);
485
+ return 0;
486
+ }
487
+ const trav = checkTraversal(s, path);
488
+ if (trav)
489
+ return trav;
490
+ const wantDir = (oflags & 2) !== 0;
491
+ if (isDir(s, path)) {
492
+ if ((effMode(s, path) & 1) === 0)
493
+ return E.ACCES;
494
+ const fd = lowestFd(proc);
495
+ proc.fds.set(fd, { kind: 'dir', path });
496
+ dv.setUint32(retPtr, fd, true);
497
+ return 0;
498
+ }
499
+ if (wantDir)
500
+ return fileExists(s, path) ? E.NOTDIR : E.NOENT;
501
+ // wasi-libc encodes the open intent in the rights: fd_read is bit 1,
502
+ // fd_write bit 6. Enforce the S2a effective mode accordingly.
503
+ const rights = typeof rightsBase === 'bigint' ? rightsBase : BigInt(rightsBase >>> 0);
504
+ let need = 0;
505
+ if ((rights & 2n) !== 0n)
506
+ need |= 4;
507
+ if ((rights & 64n) !== 0n)
508
+ need |= 2;
509
+ if ((oflags & 8) !== 0)
510
+ need |= 2; // O_TRUNC implies write
511
+ let entry = fileLookup(s, path);
512
+ const exists = entry !== null || fileExists(s, path);
513
+ if (exists && (oflags & 4))
514
+ return E.EXIST; // O_EXCL
515
+ if (!exists) {
516
+ if (!(oflags & 1))
517
+ return E.NOENT; // no O_CREAT
518
+ const denied = checkParentWritable(s, path);
519
+ if (denied)
520
+ return denied;
521
+ entry = { bytes: new Uint8Array(0) };
522
+ s.fs.files.set(path, entry);
523
+ markWritten(s, path);
524
+ }
525
+ else {
526
+ if (need && (effMode(s, path) & need) !== need)
527
+ return E.ACCES;
528
+ if (!entry) {
529
+ // Exists per the mode map but bytes were not snapshotted
530
+ // (write-only). Start from empty content.
531
+ entry = { bytes: new Uint8Array(0) };
532
+ s.fs.files.set(path, entry);
533
+ }
534
+ if (oflags & 8) { // O_TRUNC
535
+ entry.bytes = new Uint8Array(0);
536
+ markWritten(s, path);
537
+ }
538
+ }
539
+ const fd = lowestFd(proc);
540
+ proc.fds.set(fd, { kind: 'file', path, pos: 0, append: (fdflags & 1) !== 0 });
541
+ dv.setUint32(retPtr, fd, true);
542
+ return 0;
543
+ },
544
+ fd_filestat_get: (fd, buf) => {
545
+ const e = proc.fds.get(fd);
546
+ if (!e)
547
+ return E.BADF;
548
+ if (e.kind === 'file') {
549
+ const f = fileLookup(s, e.path);
550
+ statBuf(DV(), U8(), buf, 4, f ? f.bytes.length : 0, mtimeNs(s, e.path));
551
+ return 0;
552
+ }
553
+ if (e && (e.kind === 'dir' || e.kind === 'preopen')) {
554
+ statBuf(DV(), U8(), buf, 3, 0, mtimeNs(s, e.kind === 'preopen' ? '' : e.path));
555
+ return 0;
556
+ }
557
+ statBuf(DV(), U8(), buf, e && (e.kind === 'stdin' || e.kind === 'stdout' || e.kind === 'stderr' || e.kind === 'tty') ? 2 : 0, 0, realtimeNs());
558
+ return 0;
559
+ },
560
+ path_filestat_get: (dirfd, flags, pathPtr, pathLen, buf) => {
561
+ const raw = resolve(td.decode(U8().subarray(pathPtr, pathPtr + pathLen)));
562
+ if (raw === 'dev/null' || raw === 'dev/tty') {
563
+ statBuf(DV(), U8(), buf, 2, 0, realtimeNs());
564
+ return 0;
565
+ }
566
+ // SYMLINK_FOLLOW (bit 0) distinguishes stat from lstat: without it the
567
+ // link itself is the subject, which is how 'test -L' and 'ls -l' tell a
568
+ // symlink apart from what it points at.
569
+ const follow = (flags & 1) !== 0;
570
+ if (!follow && s.fs.symlinks.has(raw)) {
571
+ statBuf(DV(), U8(), buf, 7, te.encode(s.fs.symlinks.get(raw)).length, mtimeNs(s, raw));
572
+ return 0;
573
+ }
574
+ const r = followPath(s, raw);
575
+ if (r.errno)
576
+ return r.errno;
577
+ const path = r.path;
578
+ const trav = checkTraversal(s, path);
579
+ if (trav)
580
+ return trav;
581
+ const f = fileLookup(s, path);
582
+ if (f) {
583
+ statBuf(DV(), U8(), buf, 4, f.bytes.length, mtimeNs(s, path));
584
+ return 0;
585
+ }
586
+ if (isCoreutil(s, path)) {
587
+ statBuf(DV(), U8(), buf, 4, 1024, mtimeNs(s, path));
588
+ return 0;
589
+ }
590
+ if (isDir(s, path)) {
591
+ statBuf(DV(), U8(), buf, 3, 0, mtimeNs(s, path));
592
+ return 0;
593
+ }
594
+ if (fileExists(s, path)) {
595
+ statBuf(DV(), U8(), buf, 4, 0, mtimeNs(s, path));
596
+ return 0;
597
+ } // unreadable: size unknown
598
+ return E.NOENT;
599
+ },
600
+ // fstflags: ATIM=1, ATIM_NOW=2, MTIM=4, MTIM_NOW=8. Only the mtime half is
601
+ // recorded — this layer keeps one timestamp per inode, and mtime is the
602
+ // one every build tool reads.
603
+ path_filestat_set_times: (dirfd, _flags, pathPtr, pathLen, _atim, mtim, fstflags) => {
604
+ const path = resolve(td.decode(U8().subarray(pathPtr, pathPtr + pathLen)));
605
+ if (!inodeExists(s, path) && !s.fs.symlinks.has(path))
606
+ return E.NOENT;
607
+ if (fstflags & 8)
608
+ s.fs.times.set(path, realtimeNs());
609
+ else if (fstflags & 4)
610
+ s.fs.times.set(path, typeof mtim === 'bigint' ? mtim : BigInt(mtim >>> 0));
611
+ return 0;
612
+ },
613
+ path_unlink_file: (dirfd, pathPtr, pathLen) => {
614
+ // unlink removes the link, never what it points at.
615
+ const r = followParents(s, resolve(td.decode(U8().subarray(pathPtr, pathPtr + pathLen))));
616
+ if (r.errno)
617
+ return r.errno;
618
+ const path = r.path;
619
+ const trav = checkTraversal(s, path);
620
+ if (trav)
621
+ return trav;
622
+ if (isDir(s, path))
623
+ return E.ISDIR;
624
+ if (!fileExists(s, path) && !s.fs.symlinks.has(path))
625
+ return E.NOENT;
626
+ const denied = checkParentWritable(s, path);
627
+ if (denied)
628
+ return denied;
629
+ recordFileRemoved(s, path);
630
+ return 0;
631
+ },
632
+ path_rename: (fd1, oldPtr, oldLen, fd2, newPtr, newLen) => {
633
+ const from = resolve(td.decode(U8().subarray(oldPtr, oldPtr + oldLen)));
634
+ const to = resolve(td.decode(U8().subarray(newPtr, newPtr + newLen)));
635
+ let trav = checkTraversal(s, from);
636
+ if (trav)
637
+ return trav;
638
+ trav = checkTraversal(s, to);
639
+ if (trav)
640
+ return trav;
641
+ const fromIsDir = from !== '' && isDir(s, from);
642
+ const f = fileLookup(s, from);
643
+ if (!fromIsDir && !f && !fileExists(s, from))
644
+ return E.NOENT;
645
+ if (from === to)
646
+ return 0;
647
+ let denied = checkParentWritable(s, from);
648
+ if (!denied)
649
+ denied = checkParentWritable(s, to);
650
+ if (denied)
651
+ return denied;
652
+ const moveMode = (a, b) => {
653
+ const m = s.fs.modes.get(a);
654
+ s.fs.modes.delete(a);
655
+ if (m !== undefined)
656
+ s.fs.modes.set(b, m);
657
+ };
658
+ // Atomic-overwrite destination of the matching kind.
659
+ if (isDir(s, to)) {
660
+ if (!fromIsDir)
661
+ return E.ISDIR;
662
+ const prefix = to + '/';
663
+ for (const p of s.fs.files.keys())
664
+ if (p.startsWith(prefix))
665
+ return E.NOTEMPTY;
666
+ for (const p of s.fs.dirs)
667
+ if (p.startsWith(prefix))
668
+ return E.NOTEMPTY;
669
+ recordDirRemoved(s, to);
670
+ }
671
+ else if (fileExists(s, to)) {
672
+ if (fromIsDir)
673
+ return E.NOTDIR;
674
+ recordFileRemoved(s, to);
675
+ }
676
+ if (fromIsDir) {
677
+ const mode = s.fs.modes.get(from);
678
+ recordDirRemoved(s, from);
679
+ recordDirAdded(s, to);
680
+ if (mode !== undefined)
681
+ s.fs.modes.set(to, mode);
682
+ const prefix = from + '/';
683
+ const rebase = (key) => to + '/' + key.slice(prefix.length);
684
+ for (const key of [...s.fs.files.keys()]) {
685
+ if (!key.startsWith(prefix))
686
+ continue;
687
+ const nk = rebase(key);
688
+ const entry = s.fs.files.get(key);
689
+ recordFileRemoved(s, key);
690
+ moveMode(key, nk);
691
+ s.fs.files.set(nk, entry);
692
+ s.fs.written.add(nk);
693
+ s.fs.deleted.delete(nk);
694
+ if (!s.fs.modes.has(nk))
695
+ s.fs.modes.set(nk, 6);
696
+ }
697
+ for (const key of [...s.fs.dirs]) {
698
+ if (!key.startsWith(prefix))
699
+ continue;
700
+ const nk = rebase(key);
701
+ const mode2 = s.fs.modes.get(key);
702
+ recordDirRemoved(s, key);
703
+ recordDirAdded(s, nk);
704
+ if (mode2 !== undefined)
705
+ s.fs.modes.set(nk, mode2);
706
+ }
707
+ return 0;
708
+ }
709
+ const entry = f || { bytes: new Uint8Array(0) };
710
+ const mode = s.fs.modes.get(from);
711
+ recordFileRemoved(s, from);
712
+ s.fs.files.set(to, entry);
713
+ markWritten(s, to);
714
+ if (mode !== undefined)
715
+ s.fs.modes.set(to, mode);
716
+ return 0;
717
+ },
718
+ path_create_directory: (dirfd, pathPtr, pathLen) => {
719
+ const path = resolve(td.decode(U8().subarray(pathPtr, pathPtr + pathLen)));
720
+ const trav = checkTraversal(s, path);
721
+ if (trav)
722
+ return trav;
723
+ if (isDir(s, path) || fileExists(s, path))
724
+ return E.EXIST;
725
+ const denied = checkParentWritable(s, path);
726
+ if (denied)
727
+ return denied;
728
+ recordDirAdded(s, path);
729
+ return 0;
730
+ },
731
+ // path_readlink(fd, path, path_len, buf, buf_len, *bufused). Never follows
732
+ // the last component — reading a link is the one op that is about the link.
733
+ path_readlink: (dirfd, pathPtr, pathLen, bufPtr, bufLen, bufUsedPtr) => {
734
+ const r = followParents(s, resolve(td.decode(U8().subarray(pathPtr, pathPtr + pathLen))));
735
+ if (r.errno)
736
+ return r.errno;
737
+ const target = s.fs.symlinks.get(r.path);
738
+ if (target === undefined)
739
+ return inodeExists(s, r.path) ? E.INVAL : E.NOENT;
740
+ const bytes = te.encode(target);
741
+ const n = Math.min(bytes.length, bufLen);
742
+ U8().set(bytes.subarray(0, n), bufPtr);
743
+ DV().setUint32(bufUsedPtr, n, true);
744
+ return 0;
745
+ },
746
+ // path_symlink(old_path, old_path_len, fd, new_path, new_path_len) — the
747
+ // target comes FIRST and is not a path in this filesystem: it is stored
748
+ // verbatim and may dangle, exactly as ln -s allows.
749
+ path_symlink: (oldPtr, oldLen, newFd, newPtr, newLen) => {
750
+ const target = td.decode(U8().subarray(oldPtr, oldPtr + oldLen));
751
+ const r = followParents(s, resolve(td.decode(U8().subarray(newPtr, newPtr + newLen))));
752
+ if (r.errno)
753
+ return r.errno;
754
+ const link = r.path;
755
+ const trav = checkTraversal(s, link);
756
+ if (trav)
757
+ return trav;
758
+ if (inodeExists(s, link) || s.fs.symlinks.has(link))
759
+ return E.EXIST;
760
+ const denied = checkParentWritable(s, link);
761
+ if (denied)
762
+ return denied;
763
+ s.fs.symlinks.set(link, target);
764
+ s.fs.symlinksCreated.set(link, target);
765
+ s.fs.modes.set(link, 7);
766
+ s.fs.deleted.delete(link);
767
+ touchPath(s, link);
768
+ return 0;
769
+ },
770
+ path_link: (fd1, _lookupFlags, oldPtr, oldLen, fd2, newPtr, newLen) => {
771
+ const from = resolve(td.decode(U8().subarray(oldPtr, oldPtr + oldLen)));
772
+ const to = resolve(td.decode(U8().subarray(newPtr, newPtr + newLen)));
773
+ let trav = checkTraversal(s, from);
774
+ if (trav)
775
+ return trav;
776
+ trav = checkTraversal(s, to);
777
+ if (trav)
778
+ return trav;
779
+ if (isDir(s, from))
780
+ return E.PERM;
781
+ const f = fileLookup(s, from);
782
+ if (!f)
783
+ return fileExists(s, from) ? E.ACCES : E.NOENT;
784
+ if (fileExists(s, to) || isDir(s, to))
785
+ return E.EXIST;
786
+ const denied = checkParentWritable(s, to);
787
+ if (denied)
788
+ return denied;
789
+ // Both names share ONE entry object — writes through either alias
790
+ // mutate the same bytes, which is real hard-link semantics here.
791
+ s.fs.files.set(to, f);
792
+ markWritten(s, to);
793
+ s.fs.modes.set(to, effMode(s, from));
794
+ return 0;
795
+ },
796
+ path_remove_directory: (dirfd, pathPtr, pathLen) => {
797
+ const path = resolve(td.decode(U8().subarray(pathPtr, pathPtr + pathLen)));
798
+ const trav = checkTraversal(s, path);
799
+ if (trav)
800
+ return trav;
801
+ if (path === '' || path === 'etc' || path === 'dev' || path === 'bin' || path === 'usr' || path === 'usr/bin')
802
+ return E.ACCES;
803
+ if (!isDir(s, path))
804
+ return fileExists(s, path) ? E.NOTDIR : E.NOENT;
805
+ const denied = checkParentWritable(s, path);
806
+ if (denied)
807
+ return denied;
808
+ const prefix = path + '/';
809
+ for (const p of s.fs.files.keys())
810
+ if (p.startsWith(prefix))
811
+ return E.NOTEMPTY;
812
+ for (const p of s.fs.dirs)
813
+ if (p.startsWith(prefix))
814
+ return E.NOTEMPTY;
815
+ for (const p of s.fs.modes.keys())
816
+ if (p.startsWith(prefix))
817
+ return E.NOTEMPTY;
818
+ recordDirRemoved(s, path);
819
+ return 0;
820
+ },
821
+ fd_renumber: (from, to) => {
822
+ const e = proc.fds.get(from);
823
+ if (!e)
824
+ return E.BADF;
825
+ if (from !== to) {
826
+ closeFd(s, proc, to);
827
+ proc.fds.set(to, e);
828
+ proc.fds.delete(from);
829
+ }
830
+ return 0;
831
+ },
832
+ fd_readdir: (fd, buf, bufLen, cookie, retPtr) => {
833
+ const e = proc.fds.get(fd);
834
+ if (!e || (e.kind !== 'dir' && e.kind !== 'preopen'))
835
+ return E.BADF;
836
+ const dir = e.kind === 'preopen' ? '' : e.path;
837
+ if ((effMode(s, dir) & 4) === 0)
838
+ return E.ACCES;
839
+ const prefix = dir ? dir + '/' : '';
840
+ const seen = new Set(['.', '..']);
841
+ const children = [];
842
+ const push = (name, type) => { if (!seen.has(name)) {
843
+ seen.add(name);
844
+ children.push({ name, type });
845
+ } };
846
+ for (const p of s.fs.dirs) {
847
+ if (p !== dir && p.startsWith(prefix) && !p.slice(prefix.length).includes('/'))
848
+ push(p.slice(prefix.length), 3);
849
+ }
850
+ for (const p of s.fs.files.keys()) {
851
+ if (p.startsWith(prefix) && !p.slice(prefix.length).includes('/'))
852
+ push(p.slice(prefix.length), 4);
853
+ }
854
+ for (const p of s.fs.symlinks.keys()) {
855
+ if (p.startsWith(prefix) && !p.slice(prefix.length).includes('/'))
856
+ push(p.slice(prefix.length), 7);
857
+ }
858
+ for (const p of s.fs.modes.keys()) { // modes-only inodes (unreadable files)
859
+ if (p !== dir && p.startsWith(prefix) && !p.slice(prefix.length).includes('/') && !s.fs.dirs.has(p))
860
+ push(p.slice(prefix.length), 4);
861
+ }
862
+ if (dir === 'bin' || dir === 'usr/bin')
863
+ for (const name of s.coreutils.keys())
864
+ push(name, 4);
865
+ children.sort((a, b) => (a.name < b.name ? -1 : 1));
866
+ const entries = [{ name: '.', type: 3 }, { name: '..', type: 3 }, ...children];
867
+ const dv = DV(), u8 = U8();
868
+ let off = 0;
869
+ for (let i = Number(cookie); i < entries.length; i++) {
870
+ const nb = te.encode(entries[i].name);
871
+ const need = 24 + nb.length;
872
+ const record = new Uint8Array(need);
873
+ const rdv = new DataView(record.buffer);
874
+ rdv.setBigUint64(0, BigInt(i + 1), true); // d_next: cookie of the next entry
875
+ rdv.setBigUint64(8, 1n, true); // d_ino
876
+ rdv.setUint32(16, nb.length, true); // d_namlen
877
+ record[20] = entries[i].type; // d_type
878
+ record.set(nb, 24);
879
+ const room = bufLen - off;
880
+ if (need > room) { // truncated tail: "more remain"
881
+ u8.set(record.subarray(0, room), buf + off);
882
+ off = bufLen;
883
+ break;
884
+ }
885
+ u8.set(record, buf + off);
886
+ off += need;
887
+ }
888
+ dv.setUint32(retPtr, off, true);
889
+ return 0;
890
+ },
891
+ // An fd that was never opened is EBADF everywhere below. It used to be
892
+ // ESPIPE from fd_seek and plain SUCCESS from fd_tell and fd_filestat_get,
893
+ // while fd_close, fd_fdstat_get and fd_write in this same table already
894
+ // answered EBADF — one descriptor table, five different opinions about what
895
+ // a closed descriptor is. ESPIPE in particular is a yes: it means "open, and
896
+ // not seekable", so a caller using lseek to test validity read it as valid.
897
+ fd_seek: (fd, offset, whence, retPtr) => {
898
+ const e = proc.fds.get(fd);
899
+ if (!e)
900
+ return E.BADF;
901
+ if (e.kind === 'file') {
902
+ const f = fileLookup(s, e.path);
903
+ const len = f ? f.bytes.length : 0;
904
+ const off = Number(offset);
905
+ const next = whence === 0 ? off : whence === 1 ? e.pos + off : len + off;
906
+ if (next < 0)
907
+ return E.INVAL;
908
+ e.pos = next;
909
+ DV().setBigUint64(retPtr, BigInt(next), true);
910
+ return 0;
911
+ }
912
+ DV().setBigUint64(retPtr, 0n, true);
913
+ return E.SPIPE;
914
+ },
915
+ fd_tell: (fd, retPtr) => {
916
+ const e = proc.fds.get(fd);
917
+ if (!e)
918
+ return E.BADF;
919
+ DV().setBigUint64(retPtr, BigInt(e.kind === 'file' ? e.pos : 0), true);
920
+ return 0;
921
+ },
922
+ fd_close: (fd) => {
923
+ if (!proc.fds.has(fd))
924
+ return E.BADF;
925
+ closeFd(s, proc, fd);
926
+ return 0;
927
+ },
928
+ fd_fdstat_get: (fd, st) => {
929
+ const dv = DV();
930
+ const e = proc.fds.get(fd);
931
+ let ft = 4;
932
+ if (e && e.kind === 'pipe')
933
+ ft = 0;
934
+ else if (e && (e.kind === 'stdin' || e.kind === 'stdout' || e.kind === 'stderr'))
935
+ ft = s.stdinTty || fd !== 0 ? 2 : 0;
936
+ else if (e && e.kind === 'tty')
937
+ ft = 2;
938
+ else if (e && (e.kind === 'dir' || e.kind === 'preopen'))
939
+ ft = 3;
940
+ else if (!e)
941
+ return E.BADF;
942
+ dv.setUint8(st, ft);
943
+ dv.setUint16(st + 2, 0, true);
944
+ dv.setBigUint64(st + 8, 0xffffffffffffffffn, true);
945
+ dv.setBigUint64(st + 16, 0xffffffffffffffffn, true);
946
+ return 0;
947
+ },
948
+ fd_fdstat_set_flags: () => 0,
949
+ fd_read: (fd, iovs, n, nread) => io.read(fd, readIovs(DV(), iovs, n), nread),
950
+ fd_write: (fd, iovs, n, nw) => {
951
+ if (!proc.fds.has(fd))
952
+ return E.BADF;
953
+ const dv = DV(), u8 = U8();
954
+ let w = 0;
955
+ for (let i = 0; i < n; i++) {
956
+ const p = dv.getUint32(iovs + i * 8, true), l = dv.getUint32(iovs + i * 8 + 4, true);
957
+ const n2 = io.write(fd, u8.subarray(p, p + l));
958
+ if (n2 === null)
959
+ return E.BADF;
960
+ w += n2;
961
+ }
962
+ dv.setUint32(nw, w, true);
963
+ return 0;
964
+ },
965
+ poll_oneoff: (inPtr, outPtr, nsubs, retPtr) => io.poll(inPtr, outPtr, nsubs, retPtr),
966
+ clock_time_get: (id, _pr, t) => {
967
+ const ns = clockNs(id);
968
+ if (ns === null)
969
+ return E.INVAL;
970
+ DV().setBigUint64(t, ns, true);
971
+ return 0;
972
+ },
973
+ clock_res_get: (id, r) => {
974
+ if (clockNs(id) === null)
975
+ return E.INVAL;
976
+ DV().setBigUint64(r, id === CLOCK_REALTIME ? 1000000n : 1000n, true);
977
+ return 0;
978
+ },
979
+ // getRandomValues caps at 65536 bytes per call; a guest asking for more
980
+ // gets the same CSPRNG, chunked, never a weaker one.
981
+ random_get: (b, l) => {
982
+ const u = U8();
983
+ for (let off = 0; off < l; off += 65536) {
984
+ crypto.getRandomValues(u.subarray(b + off, b + off + Math.min(l - off, 65536)));
985
+ }
986
+ return 0;
987
+ },
988
+ proc_exit: (code) => { throw new Exit(code); },
989
+ };
990
+ }
991
+ // Route a write through the process fd table. The caller has already rejected
992
+ // an fd the table does not hold, so every branch here answers a real entry —
993
+ // an unknown fd must never land in the user's terminal.
994
+ function writeThroughFd(s, proc, fd, bytes) {
995
+ const e = proc.fds.get(fd);
996
+ if (e && e.kind === 'pipe') {
997
+ // A pipe descriptor has a direction, and it was recorded and never read.
998
+ // Writing to the READ end used to push bytes into the pipe and report them
999
+ // written, so `exec 3< …; echo x >&3` fed the reader its own output — data
1000
+ // appearing from nowhere, attributed to the wrong writer, with no error
1001
+ // anywhere. POSIX makes the direction part of the descriptor: EBADF.
1002
+ if (e.end === 'r')
1003
+ return null;
1004
+ const pp = s.pipes.get(e.pipeId);
1005
+ pp.chunks.push(bytes.slice());
1006
+ pp.queued += bytes.length;
1007
+ wakePipe(s, pp);
1008
+ return bytes.length;
1009
+ }
1010
+ if (e && e.kind === 'file') {
1011
+ const f = fileLookup(s, e.path) || { bytes: new Uint8Array(0) };
1012
+ if (!s.fs.files.has(e.path))
1013
+ s.fs.files.set(e.path, f);
1014
+ const pos = e.append ? f.bytes.length : e.pos;
1015
+ fileWrite(s, f, e.path, pos, bytes);
1016
+ e.pos = pos + bytes.length;
1017
+ return bytes.length;
1018
+ }
1019
+ if (e && (e.kind === 'null' || e.kind === 'tty'))
1020
+ return bytes.length;
1021
+ const text = td.decode(bytes);
1022
+ if (e.kind === 'stderr')
1023
+ s.err += text;
1024
+ else
1025
+ s.out += text;
1026
+ return bytes.length;
1027
+ }
1028
+ // Synchronous read for non-parking consumers (files, buffered pipes).
1029
+ // Returns {errno} or null when the source would block.
1030
+ function tryReadFd(s, proc, fd, dv, u8, iov, nreadPtr) {
1031
+ const e = proc.fds.get(fd);
1032
+ const deliver = (bytes) => { dv.setUint32(nreadPtr, scatter(u8, iov, bytes), true); return { errno: 0 }; };
1033
+ if (e && e.kind === 'file') {
1034
+ const f = fileLookup(s, e.path);
1035
+ const bytes = f ? f.bytes.subarray(e.pos, e.pos + iov.total) : new Uint8Array(0);
1036
+ e.pos += bytes.length;
1037
+ return deliver(bytes);
1038
+ }
1039
+ if (e && (e.kind === 'null' || e.kind === 'tty')) {
1040
+ dv.setUint32(nreadPtr, 0, true);
1041
+ return { errno: 0 };
1042
+ }
1043
+ if (e && e.kind === 'pipe') {
1044
+ const pp = s.pipes.get(e.pipeId);
1045
+ if (pp.queued > 0)
1046
+ return deliver(takeUpTo(pp, iov.total));
1047
+ if (pp.writers === 0) {
1048
+ dv.setUint32(nreadPtr, 0, true);
1049
+ return { errno: 0 };
1050
+ }
1051
+ return null;
1052
+ }
1053
+ if (e && e.kind === 'stdin') {
1054
+ const st = s.stdin;
1055
+ if (st.queued > 0)
1056
+ return deliver(takeUpTo(st, iov.total));
1057
+ if (st.closed) {
1058
+ dv.setUint32(nreadPtr, 0, true);
1059
+ return { errno: 0 };
1060
+ }
1061
+ return null;
1062
+ }
1063
+ if (e) {
1064
+ dv.setUint32(nreadPtr, 0, true);
1065
+ return { errno: 0 };
1066
+ }
1067
+ return { errno: E.BADF };
1068
+ }
1069
+ // Subscription record: 48B, userdata u64 at +0, tag u8 at +8. A CLOCK carries
1070
+ // id u32 at +16, timeout u64 at +24, flags u16 at +40 (bit 0 = ABSTIME); an
1071
+ // FD_READ/FD_WRITE carries the fd u32 at +16.
1072
+ function readSubs(dv, inPtr, nsubs) {
1073
+ const subs = [];
1074
+ for (let i = 0; i < nsubs; i++) {
1075
+ const base = inPtr + i * 48;
1076
+ const userdata = dv.getBigUint64(base, true);
1077
+ const tag = dv.getUint8(base + 8);
1078
+ if (tag === 0) {
1079
+ const id = dv.getUint32(base + 16, true);
1080
+ const timeout = dv.getBigUint64(base + 24, true);
1081
+ const abs = (dv.getUint16(base + 40, true) & 1) !== 0;
1082
+ const now = clockNs(id);
1083
+ // An unknown clock id cannot produce a deadline; the event reports
1084
+ // EINVAL rather than firing.
1085
+ subs.push(now === null
1086
+ ? { tag, userdata, id, bad: true }
1087
+ : { tag, userdata, id, deadline: abs ? timeout : now + timeout });
1088
+ }
1089
+ else {
1090
+ subs.push({ tag, userdata, fd: dv.getUint32(base + 16, true) });
1091
+ }
1092
+ }
1093
+ return subs;
1094
+ }
1095
+ function clockExpired(sub) {
1096
+ const now = clockNs(sub.id);
1097
+ return now !== null && now >= sub.deadline;
1098
+ }
1099
+ function writeEvent(dv, outPtr, slot, sub, errno, nbytes) {
1100
+ const ev = outPtr + slot * 32;
1101
+ dv.setBigUint64(ev, sub.userdata, true);
1102
+ dv.setUint16(ev + 8, errno, true);
1103
+ dv.setUint8(ev + 10, sub.tag);
1104
+ dv.setBigUint64(ev + 16, BigInt(nbytes), true);
1105
+ dv.setUint16(ev + 24, 0, true);
1106
+ }
1107
+ // Readiness of an FD_READ subscription. FD_WRITE and anything on an fd this
1108
+ // table does not hold are handled by the caller.
1109
+ function fdReadReady(s, proc, fd) {
1110
+ const e = proc.fds.get(fd);
1111
+ if (!e)
1112
+ return null;
1113
+ if (e.kind === 'pipe') {
1114
+ const pp = s.pipes.get(e.pipeId);
1115
+ return { ready: pp.queued > 0 || pp.writers === 0, avail: pp.queued };
1116
+ }
1117
+ if (e.kind === 'stdin')
1118
+ return { ready: s.stdin.queued > 0 || s.stdin.closed, avail: s.stdin.queued };
1119
+ return { ready: true, avail: 0 };
1120
+ }
1121
+ // Emit every subscription that is ready right now. Returns the event count.
1122
+ function emitReady(s, proc, dv, outPtr, subs) {
1123
+ let n = 0;
1124
+ for (const sub of subs) {
1125
+ if (sub.tag === 0) {
1126
+ if (sub.bad) {
1127
+ writeEvent(dv, outPtr, n++, sub, E.INVAL, 0);
1128
+ continue;
1129
+ }
1130
+ if (clockExpired(sub))
1131
+ writeEvent(dv, outPtr, n++, sub, 0, 0);
1132
+ continue;
1133
+ }
1134
+ const st = fdReadReady(s, proc, sub.fd);
1135
+ if (!st) {
1136
+ writeEvent(dv, outPtr, n++, sub, E.BADF, 0);
1137
+ continue;
1138
+ }
1139
+ // FD_WRITE (tag 2) never blocks here: pipes and the output buffers accept
1140
+ // whatever is handed to them.
1141
+ if (sub.tag === 2 || st.ready)
1142
+ writeEvent(dv, outPtr, n++, sub, 0, st.avail);
1143
+ }
1144
+ return n;
1145
+ }
1146
+ // Spend a clock subscription's interval by running whatever else is runnable.
1147
+ //
1148
+ // It cannot be spent waiting. This facet's clock does not advance during
1149
+ // synchronous execution — 50M spin iterations move both Date.now() and
1150
+ // performance.now() by exactly 0ms, which is the platform's timing-attack
1151
+ // mitigation rather than a quirk. A busy-wait therefore never terminates, and
1152
+ // a poll that returns no events leaves the guest spinning on the same frozen
1153
+ // clock. Running the scheduler is the only progress available; past that the
1154
+ // deadline is reported as reached. A host whose clock does advance gets a real
1155
+ // wait, and honouring one in-facet needs poll_oneoff to become async — that is
1156
+ // the migration onto runtime/wasi-instance.ts, not something a synchronous
1157
+ // implementation can express.
1158
+ // FROZEN_PROBE is a measurement, not a timeout: if the clock has not moved by
1159
+ // a single nanosecond after this many iterations, it is not going to.
1160
+ const FROZEN_PROBE = 200000;
1161
+ function waitForDeadline(s, proc, subs) {
1162
+ const clocks = subs.filter((x) => x.tag === 0 && !x.bad);
1163
+ if (!clocks.length)
1164
+ return;
1165
+ const startedNs = realtimeNs();
1166
+ let spins = 0;
1167
+ while (!clocks.some(clockExpired)) {
1168
+ if (s.rootExit !== null)
1169
+ return;
1170
+ if (subs.some((x) => x.tag === 1 && (fdReadReady(s, proc, x.fd) || { ready: true }).ready))
1171
+ return;
1172
+ if (s.runnable.length) {
1173
+ pumpOne(s);
1174
+ continue;
1175
+ }
1176
+ if (++spins > FROZEN_PROBE && realtimeNs() === startedNs)
1177
+ return;
1178
+ }
1179
+ }
1180
+ // Report every live clock subscription as fired. Reached only once the wait
1181
+ // above can make no further progress: the alternative is an eventless success,
1182
+ // which poll_oneoff may not return and which a guest cannot act on.
1183
+ function emitClocks(dv, outPtr, subs) {
1184
+ let n = 0;
1185
+ for (const sub of subs)
1186
+ if (sub.tag === 0 && !sub.bad)
1187
+ writeEvent(dv, outPtr, n++, sub, 0, 0);
1188
+ return n;
1189
+ }
1190
+ function blockTarget(s, proc, fd) {
1191
+ const e = proc.fds.get(fd);
1192
+ if (e && e.kind === 'pipe')
1193
+ return { list: s.pipes.get(e.pipeId).readW, wake: () => wakePipe(s, s.pipes.get(e.pipeId)) };
1194
+ if (e && e.kind === 'stdin')
1195
+ return { list: s.stdin.waiters, wake: () => wakeStdin(s) };
1196
+ return null;
1197
+ }
1198
+ // ── per-process bash instance ─────────────────────────────────────────
1199
+ function makeProc(s, pid, ppid, fds) {
1200
+ const proc = {
1201
+ pid, ppid, fds, inst: null, __s: s,
1202
+ ctx: { reason: null, rewinding: false, captureEnv: 0, ljEnv: 0, ljVal: 0, nextSlot: 0, resume: 0 },
1203
+ MAIN_BUF: 0, SLOT0: 0, pendingRead: null,
1204
+ slotByEnv: new Map(), freeSlots: [],
1205
+ };
1206
+ const DV = () => new DataView(proc.inst.exports.memory.buffer);
1207
+ const U8 = () => new Uint8Array(proc.inst.exports.memory.buffer);
1208
+ proc.DV = DV;
1209
+ proc.U8 = U8;
1210
+ const slotAddr = (i) => proc.SLOT0 + i * SLOT_SIZE;
1211
+ proc.slotAddr = slotAddr;
1212
+ const initHdr = (a, sz) => { const dv = DV(); dv.setUint32(a, a + 8, true); dv.setUint32(a + 4, a + sz, true); };
1213
+ proc.initHdr = initHdr;
1214
+ const wstr = (p, str) => { const b = te.encode(str); U8().set(b, p); return b.length; };
1215
+ const c = proc.ctx;
1216
+ const io = {
1217
+ read: (fd, iov, nread) => {
1218
+ if (proc.pendingRead) {
1219
+ proc.inst.exports.asyncify_stop_rewind();
1220
+ c.rewinding = false;
1221
+ const pr = proc.pendingRead;
1222
+ proc.pendingRead = null;
1223
+ DV().setUint32(pr.nreadPtr, scatter(U8(), pr.iov, pr.bytes), true);
1224
+ return 0;
1225
+ }
1226
+ const dv = DV();
1227
+ const sync = tryReadFd(s, proc, fd, dv, U8(), iov, nread);
1228
+ if (sync)
1229
+ return sync.errno;
1230
+ // would block: asyncify-park until bytes/EOF arrive
1231
+ dv.setUint32(nread, 0, true);
1232
+ c.reason = 'blockread';
1233
+ c.pipeReq = { fd, iov, nreadPtr: nread };
1234
+ initHdr(proc.MAIN_BUF, MAIN_SIZE);
1235
+ proc.inst.exports.asyncify_start_unwind(proc.MAIN_BUF);
1236
+ return 0;
1237
+ },
1238
+ write: (fd, bytes) => writeThroughFd(s, proc, fd, bytes),
1239
+ poll: (inPtr, outPtr, nsubs, retPtr) => {
1240
+ if (proc.pendingRead) { // poll resume: report the fd readable
1241
+ proc.inst.exports.asyncify_stop_rewind();
1242
+ c.rewinding = false;
1243
+ const pr = proc.pendingRead;
1244
+ proc.pendingRead = null;
1245
+ const dv = DV();
1246
+ dv.setBigUint64(outPtr, pr.pollUserdata ?? 0n, true);
1247
+ dv.setUint16(outPtr + 8, 0, true);
1248
+ dv.setUint8(outPtr + 10, 1); // eventtype fd_read
1249
+ dv.setBigUint64(outPtr + 16, BigInt(pr.bytes.length), true);
1250
+ dv.setUint16(outPtr + 24, 0, true);
1251
+ dv.setUint32(retPtr, 1, true);
1252
+ return 0;
1253
+ }
1254
+ const dv = DV();
1255
+ const subs = readSubs(dv, inPtr, nsubs);
1256
+ let emitted = emitReady(s, proc, dv, outPtr, subs);
1257
+ if (emitted > 0) {
1258
+ dv.setUint32(retPtr, emitted, true);
1259
+ return 0;
1260
+ }
1261
+ // Nothing ready. A blockable fd-read subscription parks the process so
1262
+ // the host can supply input; a clock-only wait has no such source and is
1263
+ // spent in-facet.
1264
+ const blockSub = subs.find((x) => x.tag === 1 && blockTarget(s, proc, x.fd));
1265
+ if (!blockSub) {
1266
+ waitForDeadline(s, proc, subs);
1267
+ emitted = emitReady(s, proc, dv, outPtr, subs) || emitClocks(dv, outPtr, subs);
1268
+ dv.setUint32(retPtr, emitted, true);
1269
+ return 0;
1270
+ }
1271
+ dv.setUint32(retPtr, 0, true);
1272
+ c.reason = 'blockread';
1273
+ c.pipeReq = { fd: blockSub.fd, iov: EMPTY_IOV, nreadPtr: 0, pollUserdata: blockSub.userdata };
1274
+ initHdr(proc.MAIN_BUF, MAIN_SIZE);
1275
+ proc.inst.exports.asyncify_start_unwind(proc.MAIN_BUF);
1276
+ return 0;
1277
+ },
1278
+ };
1279
+ const wasiBase = makeWasiFs(s, proc, DV, U8, io);
1280
+ const wasi = {
1281
+ ...wasiBase,
1282
+ args_sizes_get: (a, b) => { const dv = DV(); dv.setUint32(a, s.argv.length, true); dv.setUint32(b, s.argv.reduce((x, v) => x + te.encode(v).length + 1, 0), true); return 0; },
1283
+ args_get: (ptrs, buf) => { const dv = DV(); let p = buf; for (const a of s.argv) {
1284
+ dv.setUint32(ptrs, p, true);
1285
+ ptrs += 4;
1286
+ p += wstr(p, a);
1287
+ U8()[p++] = 0;
1288
+ } return 0; },
1289
+ environ_sizes_get: (a, b) => { const dv = DV(); dv.setUint32(a, s.environ.length, true); dv.setUint32(b, s.environ.reduce((x, v) => x + te.encode(v).length + 1, 0), true); return 0; },
1290
+ environ_get: (ptrs, buf) => { const dv = DV(); let p = buf; for (const v of s.environ) {
1291
+ dv.setUint32(ptrs, p, true);
1292
+ ptrs += 4;
1293
+ p += wstr(p, v);
1294
+ U8()[p++] = 0;
1295
+ } return 0; },
1296
+ };
1297
+ // Slot allocator. Each setjmp captures into a FRESH physical slot
1298
+ // (overwriting a slot in place while its snapshot is still a live
1299
+ // longjmp target corrupts the asyncify rewind — the exit-builtin's
1300
+ // jump_to_top_level recursion proved this). Correct recycling: a
1301
+ // re-setjmp of the SAME jmp_buf makes that buf's previous slot a dead
1302
+ // target (POSIX: only the most recent setjmp per buf is live), so we
1303
+ // return it to a FIFO free-list — reused only after other allocations
1304
+ // cycle through, never the just-freed address. This bounds slot use
1305
+ // for long interactive sessions (bash re-setjmps top_level per
1306
+ // command) without the in-place-overwrite hazard.
1307
+ const allocSlot = (env) => {
1308
+ const prev = proc.slotByEnv.get(env);
1309
+ if (prev !== undefined) {
1310
+ proc.slotByEnv.delete(env);
1311
+ proc.freeSlots.push(prev);
1312
+ }
1313
+ let idx;
1314
+ if (proc.freeSlots.length > 1)
1315
+ idx = proc.freeSlots.shift();
1316
+ else if (c.nextSlot < NSLOT)
1317
+ idx = c.nextSlot++;
1318
+ else
1319
+ idx = proc.freeSlots.shift();
1320
+ if (idx === undefined)
1321
+ throw new Error('bash-runner: setjmp slot budget exceeded (' + NSLOT + ')');
1322
+ proc.slotByEnv.set(env, idx);
1323
+ return idx;
1324
+ };
1325
+ const nimbus_proc = {
1326
+ setjmp: (env) => {
1327
+ if (c.rewinding) {
1328
+ proc.inst.exports.asyncify_stop_rewind();
1329
+ c.rewinding = false;
1330
+ return;
1331
+ }
1332
+ c.reason = 'capture';
1333
+ c.captureEnv = env;
1334
+ const idx = allocSlot(env);
1335
+ const dv = DV();
1336
+ dv.setInt32(env, idx, true);
1337
+ dv.setInt32(env + 4, 0, true);
1338
+ initHdr(slotAddr(idx), SLOT_SIZE);
1339
+ proc.inst.exports.asyncify_start_unwind(slotAddr(idx));
1340
+ },
1341
+ longjmp: (env, val) => {
1342
+ if (c.rewinding) {
1343
+ proc.inst.exports.asyncify_stop_rewind();
1344
+ c.rewinding = false;
1345
+ return;
1346
+ }
1347
+ c.reason = 'longjmp';
1348
+ c.ljEnv = env;
1349
+ c.ljVal = val;
1350
+ initHdr(proc.MAIN_BUF, MAIN_SIZE);
1351
+ proc.inst.exports.asyncify_start_unwind(proc.MAIN_BUF);
1352
+ },
1353
+ fork: () => {
1354
+ if (c.rewinding) {
1355
+ proc.inst.exports.asyncify_stop_rewind();
1356
+ c.rewinding = false;
1357
+ return c.resume;
1358
+ }
1359
+ c.reason = 'fork';
1360
+ initHdr(proc.MAIN_BUF, MAIN_SIZE);
1361
+ proc.inst.exports.asyncify_start_unwind(proc.MAIN_BUF);
1362
+ return 0;
1363
+ },
1364
+ vfork: () => nimbus_proc.fork(),
1365
+ waitpid: (pid, statusPtr, _opt) => {
1366
+ if (c.rewinding) {
1367
+ proc.inst.exports.asyncify_stop_rewind();
1368
+ c.rewinding = false;
1369
+ if (c.waitStatusPtr != null)
1370
+ DV().setInt32(c.waitStatusPtr, c.resumeStatus, true);
1371
+ return c.resume;
1372
+ }
1373
+ c.reason = 'waitpid';
1374
+ c.waitTarget = pid;
1375
+ c.waitStatusPtr = statusPtr;
1376
+ initHdr(proc.MAIN_BUF, MAIN_SIZE);
1377
+ proc.inst.exports.asyncify_start_unwind(proc.MAIN_BUF);
1378
+ return 0;
1379
+ },
1380
+ execve: (pathPtr, argvFlatPtr, argvLen, envFlatPtr, envLen) => {
1381
+ if (c.rewinding) {
1382
+ proc.inst.exports.asyncify_stop_rewind();
1383
+ c.rewinding = false;
1384
+ return c.resume;
1385
+ }
1386
+ const u8 = U8();
1387
+ let e = pathPtr;
1388
+ while (u8[e])
1389
+ e++;
1390
+ c.reason = 'exec';
1391
+ c.execPath = td.decode(u8.subarray(pathPtr, e));
1392
+ c.execArgv = td.decode(u8.subarray(argvFlatPtr, argvFlatPtr + argvLen)).split('\0').filter((x) => x.length);
1393
+ // The child's REAL environment (bash's export set at exec time —
1394
+ // PWD tracks the shell's cd, unlike the boot-time s.environ).
1395
+ c.execEnv = td.decode(u8.subarray(envFlatPtr, envFlatPtr + envLen)).split('\0').filter((x) => x.length);
1396
+ initHdr(proc.MAIN_BUF, MAIN_SIZE);
1397
+ proc.inst.exports.asyncify_start_unwind(proc.MAIN_BUF);
1398
+ return 0;
1399
+ },
1400
+ pipe: (fdsPtr) => {
1401
+ const id = newPipe(s);
1402
+ const rfd = lowestFd(proc);
1403
+ proc.fds.set(rfd, { kind: 'pipe', pipeId: id, end: 'r' });
1404
+ const wfd = lowestFd(proc);
1405
+ proc.fds.set(wfd, { kind: 'pipe', pipeId: id, end: 'w' });
1406
+ const dv = DV();
1407
+ dv.setInt32(fdsPtr, rfd, true);
1408
+ dv.setInt32(fdsPtr + 4, wfd, true);
1409
+ return 0;
1410
+ },
1411
+ dup: (o) => {
1412
+ const e = proc.fds.get(o);
1413
+ if (!e)
1414
+ return -E.BADF;
1415
+ const nf = lowestFd(proc);
1416
+ proc.fds.set(nf, { ...e });
1417
+ if (e.kind === 'pipe')
1418
+ bumpPipe(s, e, 1);
1419
+ return nf;
1420
+ },
1421
+ dup2: (o, n) => {
1422
+ const e = proc.fds.get(o);
1423
+ if (!e)
1424
+ return -E.BADF;
1425
+ if (o === n)
1426
+ return n;
1427
+ if (proc.fds.has(n))
1428
+ closeFd(s, proc, n);
1429
+ proc.fds.set(n, { ...e });
1430
+ if (e.kind === 'pipe')
1431
+ bumpPipe(s, e, 1);
1432
+ return n;
1433
+ },
1434
+ kill: () => 0, setpgid: () => 0, getpgid: () => proc.pid, getppid: () => proc.ppid,
1435
+ tcsetpgrp: () => 0, tcgetpgrp: () => proc.pid, tcgetattr: () => -1, tcsetattr: () => 0,
1436
+ };
1437
+ const envImports = {
1438
+ getpid: () => proc.pid, getuid: () => 0, geteuid: () => 0, getgid: () => 0, getegid: () => 0,
1439
+ setuid: () => 0, setgid: () => 0, umask: () => 0o22,
1440
+ gethostname: (p, _l) => { U8().set(te.encode('nimbus'), p); return 0; },
1441
+ dlopen: () => 0, dlsym: () => 0, dlclose: () => 0, dlerror: () => 0,
1442
+ };
1443
+ proc.inst = new WebAssembly.Instance(s.mod, { wasi_snapshot_preview1: wasi, nimbus_proc, env: envImports });
1444
+ s.stats.instances++;
1445
+ s.procs.set(pid, proc);
1446
+ return proc;
1447
+ }
1448
+ function setupArena(proc) {
1449
+ const base = proc.inst.exports.memory.buffer.byteLength;
1450
+ const need = MAIN_SIZE + NSLOT * SLOT_SIZE;
1451
+ proc.inst.exports.memory.grow(Math.ceil(need / PAGE));
1452
+ proc.MAIN_BUF = base;
1453
+ proc.SLOT0 = proc.MAIN_BUF + MAIN_SIZE;
1454
+ }
1455
+ // ── scheduler ─────────────────────────────────────────────────────────
1456
+ function resumeProc(proc) {
1457
+ proc.ctx.rewinding = true;
1458
+ proc.inst.exports.asyncify_start_rewind(proc.MAIN_BUF);
1459
+ proc.__s.runnable.push(proc);
1460
+ }
1461
+ function trackArena(s, proc, bufAddr, size, isSlot) {
1462
+ const used = proc.DV().getUint32(bufAddr, true) - (bufAddr + 8);
1463
+ if (isSlot) {
1464
+ if (used > s.stats.slotHi)
1465
+ s.stats.slotHi = used;
1466
+ }
1467
+ else if (used > s.stats.mainHi)
1468
+ s.stats.mainHi = used;
1469
+ }
1470
+ function step(s, proc) {
1471
+ const c = proc.ctx, ex = proc.inst.exports;
1472
+ try {
1473
+ ex._start();
1474
+ }
1475
+ catch (e) {
1476
+ if (e instanceof Exit) {
1477
+ finishProc(s, proc, e.code);
1478
+ return;
1479
+ }
1480
+ throw e;
1481
+ }
1482
+ if (c.reason === null) {
1483
+ finishProc(s, proc, 0);
1484
+ return;
1485
+ }
1486
+ ex.asyncify_stop_unwind();
1487
+ const r = c.reason;
1488
+ c.reason = null;
1489
+ const dv = proc.DV();
1490
+ const mem = proc.inst.exports.memory.buffer.byteLength;
1491
+ if (mem > s.stats.memPeak)
1492
+ s.stats.memPeak = mem;
1493
+ if (r === 'capture') {
1494
+ const idx = dv.getInt32(c.captureEnv, true);
1495
+ trackArena(s, proc, proc.slotAddr(idx), SLOT_SIZE, true);
1496
+ dv.setUint32(c.captureEnv + 8, dv.getUint32(proc.slotAddr(idx), true), true);
1497
+ c.rewinding = true;
1498
+ ex.asyncify_start_rewind(proc.slotAddr(idx));
1499
+ s.runnable.push(proc);
1500
+ }
1501
+ else if (r === 'longjmp') {
1502
+ trackArena(s, proc, proc.MAIN_BUF, MAIN_SIZE, false);
1503
+ const idx = dv.getInt32(c.ljEnv, true), hw = dv.getUint32(c.ljEnv + 8, true);
1504
+ dv.setInt32(c.ljEnv + 4, c.ljVal, true);
1505
+ dv.setUint32(proc.slotAddr(idx), hw, true);
1506
+ c.rewinding = true;
1507
+ ex.asyncify_start_rewind(proc.slotAddr(idx));
1508
+ s.runnable.push(proc);
1509
+ }
1510
+ else if (r === 'fork') {
1511
+ trackArena(s, proc, proc.MAIN_BUF, MAIN_SIZE, false);
1512
+ doFork(s, proc);
1513
+ }
1514
+ else if (r === 'waitpid') {
1515
+ trackArena(s, proc, proc.MAIN_BUF, MAIN_SIZE, false);
1516
+ doWait(s, proc);
1517
+ }
1518
+ else if (r === 'blockread') {
1519
+ trackArena(s, proc, proc.MAIN_BUF, MAIN_SIZE, false);
1520
+ const target = blockTarget(s, proc, c.pipeReq.fd);
1521
+ if (!target) { // fd closed under us: deliver EOF
1522
+ proc.pendingRead = { iov: c.pipeReq.iov, bytes: new Uint8Array(0), nreadPtr: c.pipeReq.nreadPtr, pollUserdata: c.pipeReq.pollUserdata };
1523
+ resumeProc(proc);
1524
+ }
1525
+ else {
1526
+ target.list.push({ proc });
1527
+ target.wake();
1528
+ }
1529
+ }
1530
+ else if (r === 'exec') {
1531
+ trackArena(s, proc, proc.MAIN_BUF, MAIN_SIZE, false);
1532
+ doExec(s, proc);
1533
+ }
1534
+ else {
1535
+ throw new Error('bash-runner: unknown unwind reason ' + r);
1536
+ }
1537
+ }
1538
+ function pumpOne(s) {
1539
+ if (!s.runnable.length)
1540
+ return false;
1541
+ step(s, s.runnable.shift());
1542
+ return true;
1543
+ }
1544
+ // exec re-homes the forked child onto a staged plain-WASI coreutil
1545
+ // bound to the process fd table (M2 exec-into-runner, in-facet). The
1546
+ // tool's blocking pipe reads synchronously pump the writer procs.
1547
+ function doExec(s, proc) {
1548
+ const name = proc.ctx.execPath.split('/').pop();
1549
+ // The child inherits bash's LIVE cwd: bash keeps the exported PWD
1550
+ // current across cd, and the execve import threads the child env.
1551
+ const env = proc.ctx.execEnv && proc.ctx.execEnv.length ? proc.ctx.execEnv : s.environ;
1552
+ const pwdVar = env.find((x) => x.startsWith('PWD='));
1553
+ const childCwd = pwdVar ? norm(pwdVar.slice(4)) : s.cwd;
1554
+ const path = makeResolve(s, childCwd)(proc.ctx.execPath);
1555
+ // Applets dispatch only from the PATH dirs they are staged in — a user
1556
+ // file that happens to share an applet's name (./ls) is NOT the applet.
1557
+ const viaPath = path.startsWith('bin/') || path.startsWith('usr/bin/');
1558
+ const m = viaPath ? s.coreutils.get(name) : null;
1559
+ if (!m) {
1560
+ // wasi-libc errno numbering: EACCES=2, ENOENT=44, ENOEXEC=45. An
1561
+ // existing non-wasm file gets ENOEXEC so bash falls back to running
1562
+ // it as a shell script (execute_disk_command's ENOEXEC path); an
1563
+ // unreadable one gets EACCES.
1564
+ proc.ctx.resume = fileLookup(s, path) ? -45 : (fileExists(s, path) ? -2 : -44);
1565
+ proc.ctx.rewinding = true;
1566
+ proc.inst.exports.asyncify_start_rewind(proc.MAIN_BUF);
1567
+ s.runnable.push(proc);
1568
+ return;
1569
+ }
1570
+ let inst2;
1571
+ const DV = () => new DataView(inst2.exports.memory.buffer);
1572
+ const U8 = () => new Uint8Array(inst2.exports.memory.buffer);
1573
+ const tv = proc.ctx.execArgv;
1574
+ // Absolute argv paths (leading '/'), normalized to root-relative keys.
1575
+ // These recover the absolute-vs-relative bit the tool's wasi-libc drops
1576
+ // (see makeResolve): a path under one of these is never re-anchored.
1577
+ const absRoots = new Set();
1578
+ for (let i = 1; i < tv.length; i++)
1579
+ if (tv[i].startsWith('/'))
1580
+ absRoots.add(norm(tv[i]));
1581
+ const wstr = (p, str) => { const b = te.encode(str); U8().set(b, p); return b.length; };
1582
+ let code = 0;
1583
+ const io = {
1584
+ read: (fd, iov, nread) => {
1585
+ const dv = DV();
1586
+ for (;;) {
1587
+ const sync = tryReadFd(s, proc, fd, dv, U8(), iov, nread);
1588
+ if (sync)
1589
+ return sync.errno;
1590
+ // Would block: pump the scheduler so writer procs make progress.
1591
+ // When nothing is runnable the source can't produce more
1592
+ // synchronously (interactive stdin mid-exec) — deliver EOF.
1593
+ if (!pumpOne(s)) {
1594
+ dv.setUint32(nread, 0, true);
1595
+ return 0;
1596
+ }
1597
+ }
1598
+ },
1599
+ write: (fd, bytes) => writeThroughFd(s, proc, fd, bytes),
1600
+ // An exec'd tool cannot park, so a wait it cannot satisfy locally is spent
1601
+ // pumping the scheduler — the same discipline its blocking reads use.
1602
+ poll: (inPtr, outPtr, nsubs, retPtr) => {
1603
+ const dv = DV();
1604
+ const subs = readSubs(dv, inPtr, nsubs);
1605
+ let emitted = emitReady(s, proc, dv, outPtr, subs);
1606
+ if (emitted === 0) {
1607
+ waitForDeadline(s, proc, subs);
1608
+ emitted = emitReady(s, proc, dv, outPtr, subs) || emitClocks(dv, outPtr, subs);
1609
+ }
1610
+ dv.setUint32(retPtr, emitted, true);
1611
+ return 0;
1612
+ },
1613
+ };
1614
+ const base = makeWasiFs(s, proc, DV, U8, io, childCwd, absRoots);
1615
+ const w = {
1616
+ ...base,
1617
+ args_sizes_get: (a, b) => { const dv = DV(); dv.setUint32(a, tv.length, true); dv.setUint32(b, tv.reduce((x, v) => x + te.encode(v).length + 1, 0), true); return 0; },
1618
+ args_get: (ptrs, buf) => { const dv = DV(); let p = buf; for (const a of tv) {
1619
+ dv.setUint32(ptrs, p, true);
1620
+ ptrs += 4;
1621
+ p += wstr(p, a);
1622
+ U8()[p++] = 0;
1623
+ } return 0; },
1624
+ // POSIX environment inheritance: the child env bash passed to execve.
1625
+ environ_sizes_get: (a, b) => { const dv = DV(); dv.setUint32(a, env.length, true); dv.setUint32(b, env.reduce((x, v) => x + te.encode(v).length + 1, 0), true); return 0; },
1626
+ environ_get: (ptrs, buf) => { const dv = DV(); let p = buf; for (const v of env) {
1627
+ dv.setUint32(ptrs, p, true);
1628
+ ptrs += 4;
1629
+ p += wstr(p, v);
1630
+ U8()[p++] = 0;
1631
+ } return 0; },
1632
+ proc_exit: (ec) => { code = ec; throw new Exit(ec); },
1633
+ };
1634
+ // nimbus_proc.chmod: WASI preview1 has no mode syscall, so busybox's
1635
+ // chmod threads through this import. In-facet the effective-mode table
1636
+ // updates immediately (chmod +x → ./script runs); the durable, S2a
1637
+ // ownership-checked chmod happens at fsDiff flush.
1638
+ const chmodResolve = makeResolve(s, childCwd, absRoots);
1639
+ const nimbus_proc = {
1640
+ chmod: (pathPtr, pathLen, mode) => {
1641
+ const p = chmodResolve(td.decode(U8().subarray(pathPtr, pathPtr + pathLen)));
1642
+ const trav = checkTraversal(s, p);
1643
+ if (trav)
1644
+ return trav;
1645
+ if (!inodeExists(s, p) && !(p !== '' && isDir(s, p)))
1646
+ return E.NOENT;
1647
+ const bits = mode & 0o777;
1648
+ s.fs.modes.set(p, (bits >> 6) & 7);
1649
+ s.fs.modesChanged.set(p, bits);
1650
+ return 0;
1651
+ },
1652
+ };
1653
+ inst2 = new WebAssembly.Instance(m, { wasi_snapshot_preview1: w, nimbus_proc });
1654
+ s.stats.instances++;
1655
+ const mem2 = inst2.exports.memory.buffer.byteLength;
1656
+ if (mem2 > s.stats.memPeak)
1657
+ s.stats.memPeak = mem2;
1658
+ try {
1659
+ inst2.exports._start();
1660
+ }
1661
+ catch (e) {
1662
+ if (e instanceof Exit)
1663
+ code = e.code;
1664
+ else
1665
+ throw e;
1666
+ }
1667
+ finishProc(s, proc, code);
1668
+ }
1669
+ function doFork(s, parent) {
1670
+ const childPid = s.pidNext++;
1671
+ const childFds = new Map();
1672
+ for (const [fd, e] of parent.fds) {
1673
+ childFds.set(fd, { ...e });
1674
+ if (e.kind === 'pipe')
1675
+ bumpPipe(s, e, 1);
1676
+ }
1677
+ const child = makeProc(s, childPid, parent.pid, childFds);
1678
+ const pmem = parent.inst.exports.memory, cmem = child.inst.exports.memory;
1679
+ if (cmem.buffer.byteLength < pmem.buffer.byteLength)
1680
+ cmem.grow((pmem.buffer.byteLength - cmem.buffer.byteLength) / PAGE);
1681
+ new Uint8Array(cmem.buffer).set(new Uint8Array(pmem.buffer));
1682
+ for (const [k, v] of Object.entries(parent.inst.exports))
1683
+ if (v instanceof WebAssembly.Global)
1684
+ child.inst.exports[k].value = v.value;
1685
+ child.MAIN_BUF = parent.MAIN_BUF;
1686
+ child.SLOT0 = parent.SLOT0;
1687
+ child.ctx.nextSlot = parent.ctx.nextSlot;
1688
+ child.slotByEnv = new Map(parent.slotByEnv);
1689
+ child.freeSlots = parent.freeSlots.slice();
1690
+ const total = s.procs.size;
1691
+ if (total * cmem.buffer.byteLength > s.stats.memPeak)
1692
+ s.stats.memPeak = total * cmem.buffer.byteLength;
1693
+ child.ctx.resume = 0;
1694
+ child.ctx.rewinding = true;
1695
+ child.inst.exports.asyncify_start_rewind(child.MAIN_BUF);
1696
+ s.runnable.push(child);
1697
+ parent.ctx.resume = childPid;
1698
+ parent.ctx.rewinding = true;
1699
+ parent.inst.exports.asyncify_start_rewind(parent.MAIN_BUF);
1700
+ s.runnable.push(parent);
1701
+ }
1702
+ function doWait(s, proc) {
1703
+ const t = proc.ctx.waitTarget;
1704
+ let pid = null;
1705
+ if (t > 0) {
1706
+ // A named target still has to be this process's child; reaping another
1707
+ // process's child by pid is the same error, just harder to reach.
1708
+ const e = s.exitStatus.get(t);
1709
+ if (e && e.ppid === proc.pid)
1710
+ pid = t;
1711
+ }
1712
+ else {
1713
+ // `wait` with no target reaps one of MY children. This used to take the
1714
+ // first entry in the map regardless of parentage, so with two subshells
1715
+ // each having had a child exit, one could consume the other's status —
1716
+ // and then block forever waiting for a child already reaped elsewhere.
1717
+ for (const [p, e] of s.exitStatus) {
1718
+ if (e.ppid === proc.pid) {
1719
+ pid = p;
1720
+ break;
1721
+ }
1722
+ }
1723
+ }
1724
+ if (pid != null) {
1725
+ const st = s.exitStatus.get(pid).status;
1726
+ s.exitStatus.delete(pid);
1727
+ proc.ctx.resume = pid;
1728
+ proc.ctx.resumeStatus = st;
1729
+ resumeProc(proc);
1730
+ }
1731
+ else {
1732
+ s.waiters.push({ proc, targetPid: t });
1733
+ }
1734
+ }
1735
+ function finishProc(s, proc, code) {
1736
+ const st = (code & 0xff) << 8;
1737
+ s.procs.delete(proc.pid);
1738
+ for (const fd of [...proc.fds.keys()])
1739
+ closeFd(s, proc, fd);
1740
+ if (proc.ppid === 0)
1741
+ s.rootExit = code;
1742
+ s.exitStatus.set(proc.pid, { status: st, ppid: proc.ppid });
1743
+ for (let i = 0; i < s.waiters.length; i++) {
1744
+ const w = s.waiters[i];
1745
+ // Only the parent may be woken by this exit — a waiter in another subshell
1746
+ // is not waiting for this child, and waking it hands over a status that was
1747
+ // never its to claim.
1748
+ if (w.proc.pid === proc.ppid && (w.targetPid === proc.pid || w.targetPid <= 0)) {
1749
+ s.waiters.splice(i, 1);
1750
+ w.proc.ctx.resume = proc.pid;
1751
+ w.proc.ctx.resumeStatus = st;
1752
+ s.exitStatus.delete(proc.pid);
1753
+ resumeProc(w.proc);
1754
+ break;
1755
+ }
1756
+ }
1757
+ }
1758
+ function composeFsDiff(s) {
1759
+ const filesWritten = {};
1760
+ for (const path of s.fs.written) {
1761
+ if (path.startsWith('etc/nimbus.bashrc'))
1762
+ continue;
1763
+ const f = s.fs.files.get(path);
1764
+ if (f)
1765
+ filesWritten[path] = bytesToB64(f.bytes);
1766
+ }
1767
+ return {
1768
+ filesWritten,
1769
+ filesDeleted: [...s.fs.deleted],
1770
+ dirsCreated: [...s.fs.dirsCreated],
1771
+ // Deepest-first so the flush rmdirs children before their parents.
1772
+ dirsDeleted: [...s.fs.dirsDeleted].sort((a, b) => b.length - a.length),
1773
+ modesChanged: Object.fromEntries(s.fs.modesChanged),
1774
+ symlinksCreated: Object.fromEntries(s.fs.symlinksCreated),
1775
+ };
1776
+ }
1777
+ function pump(s) {
1778
+ try {
1779
+ while (s.runnable.length) {
1780
+ if (++s.steps > 5_000_000)
1781
+ throw new Error('bash-runner: runaway scheduler (>5M steps)');
1782
+ step(s, s.runnable.shift());
1783
+ if (s.rootExit !== null)
1784
+ break;
1785
+ }
1786
+ }
1787
+ catch (e) {
1788
+ s.error = String(e && e.stack || e && e.message || e);
1789
+ }
1790
+ const out = s.out, err = s.err;
1791
+ s.out = '';
1792
+ s.err = '';
1793
+ const stats = { ...s.stats, steps: s.steps, missingWasi: [...s.missingWasi] };
1794
+ if (s.error) {
1795
+ S = null;
1796
+ return { state: 'error', exitCode: 1, stdout: out, stderr: err, error: s.error, stats };
1797
+ }
1798
+ if (s.rootExit !== null || s.procs.size === 0) {
1799
+ const code = s.rootExit === null ? 0 : s.rootExit;
1800
+ const fsDiff = composeFsDiff(s);
1801
+ S = null;
1802
+ return { state: 'exited', exitCode: code, stdout: out, stderr: err, fsDiff, stats };
1803
+ }
1804
+ if (s.stdin.waiters.length > 0) {
1805
+ return { state: 'need-input', exitCode: 0, stdout: out, stderr: err, stats };
1806
+ }
1807
+ S = null;
1808
+ return { state: 'error', exitCode: 1, stdout: out, stderr: err, error: 'bash-runner: deadlock — live procs with empty run queue', stats };
1809
+ }
1810
+ globalThis.__bashBoot = function __bashBoot(args) {
1811
+ try {
1812
+ S = newSession(args);
1813
+ initStdinQueued(S);
1814
+ const root = makeProc(S, S.pidNext++, 0, new Map([
1815
+ [0, { kind: 'stdin' }], [1, { kind: 'stdout' }], [2, { kind: 'stderr' }],
1816
+ [3, { kind: 'preopen' }],
1817
+ ]));
1818
+ S.rootPid = root.pid;
1819
+ setupArena(root);
1820
+ S.runnable.push(root);
1821
+ return pump(S);
1822
+ }
1823
+ catch (e) {
1824
+ S = null;
1825
+ return { state: 'error', exitCode: 1, stdout: '', stderr: '', error: 'boot failed: ' + String(e && e.message || e) };
1826
+ }
1827
+ };
1828
+ globalThis.__bashFeed = function __bashFeed(args) {
1829
+ if (!S) {
1830
+ return { state: 'error', exitCode: 1, stdout: '', stderr: '', error: 'bash facet has no active session (warm isolate recycled?)' };
1831
+ }
1832
+ try {
1833
+ if (args.data) {
1834
+ const b = te.encode(args.data);
1835
+ S.stdin.chunks.push(b);
1836
+ S.stdin.queued += b.length;
1837
+ }
1838
+ if (args.eof)
1839
+ S.stdin.closed = true;
1840
+ wakeStdin(S);
1841
+ return pump(S);
1842
+ }
1843
+ catch (e) {
1844
+ const s = S;
1845
+ S = null;
1846
+ return { state: 'error', exitCode: 1, stdout: s ? s.out : '', stderr: s ? s.err : '', error: 'feed failed: ' + String(e && e.message || e) };
1847
+ }
1848
+ };
1849
+ export {};