@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,1863 @@
1
+ import { resolve } from '../utils/path.js';
2
+ import { BOLD, GREEN, BLUE, RESET } from '../utils/colors.js';
3
+ import { VFSError } from '../kernel/vfs/index.js';
4
+ import { ExitSignal, Interpreter, assignScalar, } from './interpreter.js';
5
+ import { lex } from './lexer.js';
6
+ import { TokenKind } from './types.js';
7
+ import { HistoryManager } from './history.js';
8
+ import { JobTable } from './jobs.js';
9
+ import { signalAbortReason } from './signals.js';
10
+ import { complete } from './completer.js';
11
+ import { evaluateTest } from './test-builtin.js';
12
+ import { TerminalStdin } from './terminal-stdin.js';
13
+ import { normalizeTerminalNewlines } from '../../../_shared/terminal.js';
14
+ import { readDefaultShell } from './default-shell.js';
15
+ function shellPromptParts(env, cwd) {
16
+ const home = env['HOME'] ?? '/home/user';
17
+ let displayPath = cwd;
18
+ if (cwd === home) {
19
+ displayPath = '~';
20
+ }
21
+ else if (cwd.startsWith(home + '/')) {
22
+ displayPath = '~' + cwd.slice(home.length);
23
+ }
24
+ return {
25
+ displayPath,
26
+ user: env['USER'] ?? 'user',
27
+ host: env['HOSTNAME'] ?? 'lifo',
28
+ };
29
+ }
30
+ export function formatShellPrompt(env, cwd) {
31
+ const { displayPath, user, host } = shellPromptParts(env, cwd);
32
+ return `${BOLD}${GREEN}${user}@${host}${RESET}:${BOLD}${BLUE}${displayPath}${RESET}$ `;
33
+ }
34
+ export class Shell {
35
+ terminal;
36
+ vfs;
37
+ registry;
38
+ cwd;
39
+ env;
40
+ // Alias map
41
+ aliases = new Map();
42
+ // Line editing state
43
+ lineBuffer = '';
44
+ cursorPos = 0;
45
+ screenCursorRow = 0; // tracks the actual terminal row (relative to prompt start)
46
+ // History (legacy array kept for backward compat with tests)
47
+ history = [];
48
+ historyIndex = -1;
49
+ savedLine = '';
50
+ // Running command
51
+ running = false;
52
+ abortController = null;
53
+ terminalStdin = null;
54
+ stdinLineBuffer = '';
55
+ stdinCursorPos = 0;
56
+ // New Sprint 2 components
57
+ interpreter;
58
+ interpreterConfig;
59
+ historyManager;
60
+ jobTable;
61
+ processRegistry;
62
+ builtins;
63
+ shellOptions = {
64
+ errexit: false,
65
+ nounset: false,
66
+ pipefail: false,
67
+ };
68
+ traps = new Map();
69
+ readonlyNames = new Set();
70
+ /** Indexed arrays; `env` holds the scalars. A name lives in exactly one. */
71
+ arrays = new Map();
72
+ commandIdentity;
73
+ // Tab completion state
74
+ tabCount = 0;
75
+ // Paste queue for multiline paste support
76
+ pasteQueue = [];
77
+ /**
78
+ * Keystrokes that arrived while a foreground command owned the terminal and
79
+ * nothing was reading stdin. A tty buffers type-ahead and hands it to the
80
+ * shell when the job exits; dropping it loses whatever the user typed, and
81
+ * when a dispatch never settles it leaves that connection with no feedback
82
+ * whatsoever. Held as whole chunks so a multi-byte escape sequence replays
83
+ * as one keystroke rather than three.
84
+ */
85
+ typeAhead = [];
86
+ constructor(terminal, vfs, registry, env, processRegistry, commandIdentity) {
87
+ this.terminal = terminal;
88
+ this.vfs = vfs;
89
+ this.registry = registry;
90
+ this.cwd = env['HOME'] ?? '/home/user';
91
+ this.env = { ...env };
92
+ if (!this.env['0'])
93
+ this.env['0'] = 'nimbus-sh';
94
+ if (!this.env['$'])
95
+ this.env['$'] = String(processRegistry.registerShell(this.cwd, this.env));
96
+ let defaultCred = { uid: 1000, gid: 1000, groups: [1000], umask: 0o022 };
97
+ this.commandIdentity = commandIdentity ?? {
98
+ pid: Number(this.env['$']),
99
+ get cred() { return defaultCred; },
100
+ setUmask: (mask) => {
101
+ defaultCred = { ...defaultCred, umask: mask };
102
+ },
103
+ };
104
+ // Initialize builtins
105
+ this.builtins = new Map();
106
+ this.registerBuiltins();
107
+ // Initialize job table (legacy - still used for backward compat)
108
+ this.jobTable = new JobTable();
109
+ // Use shared process registry from Kernel
110
+ this.processRegistry = processRegistry;
111
+ // Initialize history manager
112
+ this.historyManager = new HistoryManager(vfs);
113
+ this.historyManager.load();
114
+ // Initialize interpreter
115
+ this.interpreterConfig = {
116
+ env: this.env,
117
+ arrays: this.arrays,
118
+ getCwd: () => this.cwd,
119
+ setCwd: (cwd) => { this.cwd = cwd; },
120
+ vfs: this.vfs,
121
+ registry: this.registry,
122
+ builtins: this.builtins,
123
+ jobTable: this.jobTable,
124
+ processRegistry: this.processRegistry,
125
+ writeToTerminal: (text) => this.writeToTerminal(text),
126
+ aliases: this.aliases,
127
+ getAbortSignal: () => this.abortController?.signal ?? new AbortController().signal,
128
+ options: this.shellOptions,
129
+ traps: this.traps,
130
+ readonlyNames: this.readonlyNames,
131
+ };
132
+ this.interpreter = new Interpreter(this.interpreterConfig);
133
+ }
134
+ registerBuiltins() {
135
+ this.builtins.set('cd', (args, _stdout, stderr) => this.builtinCd(args, stderr));
136
+ this.builtins.set('pwd', (_args, stdout) => this.builtinPwd(stdout));
137
+ this.builtins.set('echo', (args, stdout) => this.builtinEcho(args, stdout));
138
+ this.builtins.set('clear', () => this.builtinClear());
139
+ this.builtins.set('export', (args, _stdout, stderr) => this.builtinExport(args, stderr));
140
+ this.builtins.set('exit', (args, _stdout, stderr) => this.builtinExit(args, stderr));
141
+ this.builtins.set('true', () => Promise.resolve(0));
142
+ this.builtins.set('false', () => Promise.resolve(1));
143
+ this.builtins.set(':', () => Promise.resolve(0));
144
+ this.builtins.set('set', (args, stdout, stderr, _stdin, context) => this.builtinSet(args, stdout, stderr, context));
145
+ this.builtins.set('shift', (args, _stdout, stderr, _stdin, context) => this.builtinShift(args, stderr, context));
146
+ this.builtins.set('trap', (args, stdout, stderr) => this.builtinTrap(args, stdout, stderr));
147
+ this.builtins.set('hash', (args, stdout, stderr) => this.builtinHash(args, stdout, stderr));
148
+ this.builtins.set('readonly', (args, stdout, stderr) => this.builtinReadonly(args, stdout, stderr));
149
+ this.builtins.set('read', (args, _stdout, stderr, stdin, context) => this.builtinRead(args, stdin, stderr, context));
150
+ this.builtins.set('wait', (args, _stdout, stderr) => this.builtinWait(args, stderr));
151
+ this.builtins.set('unset', (args, _stdout, stderr) => this.builtinUnset(args, stderr));
152
+ this.builtins.set('local', (args, _stdout, stderr, _stdin, context) => this.builtinDeclare('local', args, stderr, context));
153
+ this.builtins.set('declare', (args, _stdout, stderr, _stdin, context) => this.builtinDeclare('declare', args, stderr, context));
154
+ this.builtins.set('typeset', (args, _stdout, stderr, _stdin, context) => this.builtinDeclare('typeset', args, stderr, context));
155
+ this.builtins.set('jobs', (_args, stdout) => this.builtinJobs(stdout));
156
+ this.builtins.set('fg', (args, stdout, stderr) => this.builtinFg(args, stdout, stderr));
157
+ this.builtins.set('bg', (args, stdout, stderr) => this.builtinBg(args, stdout, stderr));
158
+ this.builtins.set('history', (_args, stdout) => this.builtinHistory(stdout));
159
+ this.builtins.set('source', (args, stdout, stderr, _stdin, context) => this.builtinSource(args, stdout, stderr, context));
160
+ this.builtins.set('.', (args, stdout, stderr, _stdin, context) => this.builtinSource(args, stdout, stderr, context));
161
+ this.builtins.set('alias', (args, stdout) => this.builtinAlias(args, stdout));
162
+ this.builtins.set('unalias', (args, _stdout, stderr) => this.builtinUnalias(args, stderr));
163
+ this.builtins.set('test', (args, _stdout, stderr, _stdin, context) => evaluateTest(args, context?.vfs ?? this.vfs, stderr, context));
164
+ this.builtins.set('[', (args, _stdout, stderr, _stdin, context) => evaluateTest(args, context?.vfs ?? this.vfs, stderr, context));
165
+ }
166
+ getJobTable() {
167
+ return this.jobTable;
168
+ }
169
+ getProcessRegistry() {
170
+ return this.processRegistry;
171
+ }
172
+ getCwd() {
173
+ return this.cwd;
174
+ }
175
+ setCwd(cwd) {
176
+ this.cwd = cwd;
177
+ }
178
+ getEnv() {
179
+ return this.env;
180
+ }
181
+ getVfs() {
182
+ return this.vfs;
183
+ }
184
+ getRegistry() {
185
+ return this.registry;
186
+ }
187
+ /**
188
+ * Programmatic command execution with captured stdout/stderr.
189
+ * Used by Sandbox.commands.run() for headless mode.
190
+ */
191
+ _executeDepth = 0;
192
+ async execute(cmd, options) {
193
+ this._executeDepth++;
194
+ if (this._executeDepth > 10) {
195
+ this._executeDepth--;
196
+ const msg = `shell.execute: recursion depth exceeded (cmd="${cmd}")\n`;
197
+ options?.onStderr?.(msg);
198
+ return { stdout: '', stderr: msg, exitCode: 1 };
199
+ }
200
+ let stdoutBuf = '';
201
+ let stderrBuf = '';
202
+ const stdoutStream = {
203
+ write: (text) => {
204
+ stdoutBuf += text;
205
+ options?.onStdout?.(text);
206
+ },
207
+ };
208
+ const stderrStream = {
209
+ write: (text) => {
210
+ stderrBuf += text;
211
+ options?.onStderr?.(text);
212
+ },
213
+ };
214
+ // Save current state
215
+ const prevCwd = options?.cwd ? this.cwd : undefined;
216
+ const savedShellState = options?.isolateShellState ? this.snapshotShellState() : null;
217
+ const envOverrideSnapshot = !savedShellState && options?.env
218
+ ? snapshotEnvKeys(this.env, Object.keys(options.env))
219
+ : null;
220
+ const optionSnapshot = !savedShellState && options?.shellOptions ? { ...this.shellOptions } : null;
221
+ const abortController = new AbortController();
222
+ const abortFromCaller = () => abortController.abort(options?.signal?.reason);
223
+ if (options?.signal) {
224
+ if (options.signal.aborted)
225
+ abortFromCaller();
226
+ else
227
+ options.signal.addEventListener('abort', abortFromCaller, { once: true });
228
+ }
229
+ // Per-execution capture sink for shell-level direct-terminal writes
230
+ // (`/dev/tty`, command-stdout fallback). Threaded through `executeLine`
231
+ // options so a nested `execute` never mutates shared interpreter config the
232
+ // parent command's late-bound closures read.
233
+ const writeToTerminal = (text) => {
234
+ stderrBuf += text;
235
+ options?.onStderr?.(text);
236
+ };
237
+ // Apply per-call overrides
238
+ if (options?.cwd) {
239
+ this.cwd = options.cwd;
240
+ }
241
+ if (options?.env) {
242
+ Object.assign(this.env, options.env);
243
+ }
244
+ if (options?.shellOptions) {
245
+ Object.assign(this.shellOptions, options.shellOptions);
246
+ }
247
+ let stdinStream;
248
+ if (options?.stdin !== undefined) {
249
+ const fixedStdin = new TerminalStdin();
250
+ fixedStdin.feed(options.stdin);
251
+ fixedStdin.close();
252
+ stdinStream = fixedStdin;
253
+ }
254
+ try {
255
+ const exitCode = await this.interpreter.executeLine(cmd, options?.terminalStdin, {
256
+ runExitTrap: options?.runExitTrap === true,
257
+ stdin: stdinStream,
258
+ stdout: stdoutStream,
259
+ stderr: stderrStream,
260
+ writeToTerminal,
261
+ terminalFds: options?.terminalFds,
262
+ scriptMode: options?.scriptMode === true,
263
+ commandContext: options?.commandContext,
264
+ commandIdentity: this.resolveCommandIdentity(options?.commandContext),
265
+ runAs: options?.runAs ?? this.commandIdentity.runAs,
266
+ signal: abortController.signal,
267
+ });
268
+ return { stdout: stdoutBuf, stderr: stderrBuf, exitCode };
269
+ }
270
+ catch (e) {
271
+ const msg = e instanceof Error ? (e.stack || e.message) : String(e);
272
+ stderrBuf += msg + '\n';
273
+ options?.onStderr?.(msg + '\n');
274
+ return { stdout: stdoutBuf, stderr: stderrBuf, exitCode: 1 };
275
+ }
276
+ finally {
277
+ this._executeDepth--;
278
+ // Restore state
279
+ if (options?.signal) {
280
+ options.signal.removeEventListener('abort', abortFromCaller);
281
+ }
282
+ if (savedShellState) {
283
+ this.restoreShellState(savedShellState);
284
+ }
285
+ else {
286
+ if (envOverrideSnapshot)
287
+ restoreEnvKeys(this.env, envOverrideSnapshot);
288
+ if (optionSnapshot)
289
+ restoreShellOptions(this.shellOptions, optionSnapshot);
290
+ }
291
+ if (prevCwd !== undefined) {
292
+ this.cwd = prevCwd;
293
+ }
294
+ }
295
+ }
296
+ resolveCommandIdentity(overrides) {
297
+ const pid = overrides?.['pid'];
298
+ const cred = overrides?.['cred'];
299
+ const setUmask = overrides?.['setUmask'];
300
+ return {
301
+ pid: typeof pid === 'number' ? pid : this.commandIdentity.pid,
302
+ cred: isVfsCred(cred) ? cred : this.commandIdentity.cred,
303
+ setUmask: typeof setUmask === 'function'
304
+ ? (mask) => setUmask(mask)
305
+ : this.commandIdentity.setUmask,
306
+ runAs: this.commandIdentity.runAs,
307
+ };
308
+ }
309
+ start() {
310
+ // Register this shell instance as a process
311
+ // First shell gets PID 1, subsequent shells get PID 2, 3, etc.
312
+ const pid = this.processRegistry.registerShell(this.cwd, this.env);
313
+ this.env['$'] = String(pid);
314
+ this.terminal.onData((data) => this.handleInput(data));
315
+ // Source rc files on startup (like bash/zsh)
316
+ this.sourceRcFiles().then(async () => {
317
+ const home = this.env['HOME'] ?? '/home/user';
318
+ if (readDefaultShell(this.vfs, home) === 'bash') {
319
+ await this.executeLine('bash -i');
320
+ }
321
+ else {
322
+ this.printPrompt();
323
+ }
324
+ });
325
+ }
326
+ async sourceRcFiles() {
327
+ const home = this.env['HOME'] ?? '/home/user';
328
+ // Source system-wide profile first
329
+ await this.sourceFile('/etc/profile');
330
+ // Then user rc files (first one found wins, like bash)
331
+ const rcFiles = [
332
+ `${home}/.liforc`,
333
+ `${home}/.bashrc`,
334
+ `${home}/.profile`,
335
+ ];
336
+ for (const rc of rcFiles) {
337
+ if (this.vfs.exists(rc)) {
338
+ await this.sourceFile(rc);
339
+ break;
340
+ }
341
+ }
342
+ }
343
+ printPrompt() {
344
+ // Report finished background jobs from JobTable (legacy)
345
+ const doneJobs = this.jobTable.collectDone();
346
+ for (const job of doneJobs) {
347
+ this.writeToTerminal(`[${job.id}] Done ${job.command}\n`);
348
+ }
349
+ // Collect and reap zombie processes from ProcessRegistry
350
+ this.processRegistry.collectZombies();
351
+ // Zombies are already logged by JobTable above, so no need to log again
352
+ this.terminal.write(formatShellPrompt(this.env, this.cwd));
353
+ }
354
+ handleInput(data) {
355
+ // Raw mode: bypass all shell line editing, deliver keypresses directly
356
+ if (this.running && this.terminalStdin?.rawMode) {
357
+ this.terminalStdin.feed(data);
358
+ return;
359
+ }
360
+ // Multiline paste detection: if data contains newlines and has multiple chars,
361
+ // split into lines and execute them sequentially via the paste queue
362
+ if (!this.running && data.length > 1 && /[\r\n]/.test(data)) {
363
+ const lines = data.split(/\r\n|\r|\n/);
364
+ for (let i = 0; i < lines.length; i++) {
365
+ const segment = lines[i];
366
+ if (i === 0) {
367
+ // First segment: append to current lineBuffer and execute
368
+ if (segment) {
369
+ this.lineBuffer = this.lineBuffer.slice(0, this.cursorPos) + segment + this.lineBuffer.slice(this.cursorPos);
370
+ this.cursorPos += segment.length;
371
+ }
372
+ if (i < lines.length - 1) {
373
+ // There's a newline after this segment, execute it
374
+ this.redrawLine();
375
+ this.terminal.write('\r\n');
376
+ const line = this.lineBuffer.trim();
377
+ this.lineBuffer = '';
378
+ this.cursorPos = 0;
379
+ this.historyIndex = -1;
380
+ if (line) {
381
+ this.history.push(line);
382
+ // Queue remaining lines before executing
383
+ for (let j = 1; j < lines.length - 1; j++) {
384
+ if (lines[j])
385
+ this.pasteQueue.push(lines[j]);
386
+ }
387
+ // Last segment (after final newline) goes into lineBuffer without executing
388
+ const lastSegment = lines[lines.length - 1];
389
+ if (lastSegment) {
390
+ this.pasteQueue.push(lastSegment);
391
+ }
392
+ this.executeLine(line);
393
+ return;
394
+ }
395
+ else {
396
+ // Empty first line, queue the rest
397
+ for (let j = 1; j < lines.length - 1; j++) {
398
+ if (lines[j])
399
+ this.pasteQueue.push(lines[j]);
400
+ }
401
+ const lastSegment = lines[lines.length - 1];
402
+ if (lastSegment) {
403
+ this.pasteQueue.push(lastSegment);
404
+ }
405
+ this.drainPasteQueue();
406
+ return;
407
+ }
408
+ }
409
+ }
410
+ }
411
+ // If we get here, data had newlines but only one segment (shouldn't happen)
412
+ // Fall through to normal handling
413
+ if (this.lineBuffer)
414
+ this.redrawLine();
415
+ return;
416
+ }
417
+ // ESC sequences. Cursor motion and history are line EDITING, so they only
418
+ // belong to a shell that owns the line. While a command runs they must
419
+ // fall through: to the stdin reader that has its own cursor (and its own
420
+ // handlers for these very sequences), or to the type-ahead buffer.
421
+ if (!this.running) {
422
+ if (data === '\x1b[D') {
423
+ this.moveCursorLeft();
424
+ return;
425
+ }
426
+ if (data === '\x1b[C') {
427
+ this.moveCursorRight();
428
+ return;
429
+ }
430
+ if (data === '\x1b[A') {
431
+ this.historyUp();
432
+ return;
433
+ }
434
+ if (data === '\x1b[B') {
435
+ this.historyDown();
436
+ return;
437
+ }
438
+ if (data === '\x1b[H' || data === '\x01') {
439
+ this.moveCursorHome();
440
+ return;
441
+ } // Home / Ctrl+A
442
+ if (data === '\x1b[F' || data === '\x05') {
443
+ this.moveCursorEnd();
444
+ return;
445
+ } // End / Ctrl+E
446
+ }
447
+ // Ctrl+C (SIGINT) and Ctrl+\ (SIGQUIT) — the terminal's two signal keys.
448
+ // Both go to the foreground command; with no foreground job, Ctrl+C
449
+ // cancels the line and Ctrl+\ is absorbed, as readline does.
450
+ if (data === '\x03' || data === '\x1c') {
451
+ const signal = data === '\x03' ? 'INT' : 'QUIT';
452
+ if (this.running && this.abortController) {
453
+ this.terminalStdin?.close();
454
+ this.stdinLineBuffer = '';
455
+ this.stdinCursorPos = 0;
456
+ this.abortController.abort(signalAbortReason(signal));
457
+ }
458
+ else if (signal === 'INT') {
459
+ this.terminal.write('^C\r\n');
460
+ this.lineBuffer = '';
461
+ this.cursorPos = 0;
462
+ this.screenCursorRow = 0;
463
+ this.printPrompt();
464
+ }
465
+ return;
466
+ }
467
+ // Ctrl+D (EOF)
468
+ if (data === '\x04') {
469
+ if (this.running && this.terminalStdin && this.stdinLineBuffer.length === 0) {
470
+ this.terminalStdin.close();
471
+ return;
472
+ }
473
+ // When not running, Ctrl+D on empty line does nothing (or could exit)
474
+ return;
475
+ }
476
+ // Ctrl+U -- clear line
477
+ if (data === '\x15') {
478
+ if (this.running && this.terminalStdin?.isWaiting) {
479
+ // Clear the stdin line buffer
480
+ if (this.stdinCursorPos > 0) {
481
+ this.terminal.write(`\x1b[${this.stdinCursorPos}D`);
482
+ }
483
+ this.terminal.write('\x1b[K');
484
+ this.stdinLineBuffer = '';
485
+ this.stdinCursorPos = 0;
486
+ return;
487
+ }
488
+ // Use redrawLine to clear wrapped content, then reset
489
+ this.lineBuffer = '';
490
+ this.cursorPos = 0;
491
+ this.redrawLine();
492
+ return;
493
+ }
494
+ // When a command is running and waiting for stdin, forward input
495
+ if (this.running && this.terminalStdin?.isWaiting) {
496
+ this.handleStdinInput(data);
497
+ return;
498
+ }
499
+ // A foreground command owns the line editor and nothing is reading stdin,
500
+ // so this is type-ahead. Echo it — that is what a tty does, and it is the
501
+ // only sign of life a wedged dispatch can give — then hold it for replay.
502
+ if (this.running) {
503
+ this.typeAhead.push(data);
504
+ if (data === '\r')
505
+ this.terminal.write('\r\n');
506
+ else if (data >= ' ' && data !== '\x7f')
507
+ this.terminal.write(normalizeTerminalNewlines(data));
508
+ return;
509
+ }
510
+ // Tab completion
511
+ if (data === '\t') {
512
+ this.handleTab();
513
+ return;
514
+ }
515
+ // Reset tab state on any non-tab input
516
+ this.tabCount = 0;
517
+ // Enter
518
+ if (data === '\r') {
519
+ this.terminal.write('\r\n');
520
+ const line = this.lineBuffer.trim();
521
+ this.lineBuffer = '';
522
+ this.cursorPos = 0;
523
+ this.screenCursorRow = 0;
524
+ this.historyIndex = -1;
525
+ if (line) {
526
+ this.history.push(line);
527
+ this.executeLine(line);
528
+ }
529
+ else {
530
+ this.printPrompt();
531
+ }
532
+ return;
533
+ }
534
+ // Backspace
535
+ if (data === '\x7f' || data === '\b') {
536
+ if (this.cursorPos > 0) {
537
+ const before = this.lineBuffer.slice(0, this.cursorPos - 1);
538
+ const after = this.lineBuffer.slice(this.cursorPos);
539
+ this.lineBuffer = before + after;
540
+ this.cursorPos--;
541
+ this.redrawLine();
542
+ }
543
+ return;
544
+ }
545
+ // Delete
546
+ if (data === '\x1b[3~') {
547
+ if (this.cursorPos < this.lineBuffer.length) {
548
+ const before = this.lineBuffer.slice(0, this.cursorPos);
549
+ const after = this.lineBuffer.slice(this.cursorPos + 1);
550
+ this.lineBuffer = before + after;
551
+ this.redrawLine();
552
+ }
553
+ return;
554
+ }
555
+ // Printable characters
556
+ if (data >= ' ') {
557
+ // Insert at cursor
558
+ const before = this.lineBuffer.slice(0, this.cursorPos);
559
+ const after = this.lineBuffer.slice(this.cursorPos);
560
+ this.lineBuffer = before + data + after;
561
+ this.cursorPos += data.length;
562
+ this.redrawLine();
563
+ }
564
+ }
565
+ handleTab() {
566
+ const completionCtx = {
567
+ line: this.lineBuffer,
568
+ cursorPos: this.cursorPos,
569
+ cwd: this.cwd,
570
+ env: this.env,
571
+ vfs: this.vfs,
572
+ registry: this.registry,
573
+ builtinNames: [...this.builtins.keys()],
574
+ };
575
+ const result = complete(completionCtx);
576
+ const currentWord = this.lineBuffer.slice(result.replacementStart, result.replacementEnd);
577
+ if (result.completions.length === 0) {
578
+ // No completions -- bell
579
+ this.terminal.write('\x07');
580
+ return;
581
+ }
582
+ if (result.completions.length === 1) {
583
+ // Single completion -- insert it
584
+ const completion = result.completions[0];
585
+ const suffix = completion.endsWith('/') ? '' : ' ';
586
+ this.applyCompletion(result.replacementStart, result.replacementEnd, completion + suffix);
587
+ this.tabCount = 0;
588
+ return;
589
+ }
590
+ // Multiple completions
591
+ if (result.commonPrefix.length > currentWord.length) {
592
+ // Extend to common prefix
593
+ this.applyCompletion(result.replacementStart, result.replacementEnd, result.commonPrefix);
594
+ this.tabCount = 0;
595
+ return;
596
+ }
597
+ // Same word as before -- second tab shows all completions
598
+ this.tabCount++;
599
+ if (this.tabCount >= 2) {
600
+ this.terminal.write('\r\n');
601
+ this.writeToTerminal(result.completions.join(' ') + '\n');
602
+ this.printPrompt();
603
+ this.terminal.write(this.lineBuffer);
604
+ // Move cursor to correct position
605
+ const diff = this.lineBuffer.length - this.cursorPos;
606
+ if (diff > 0) {
607
+ this.terminal.write(`\x1b[${diff}D`);
608
+ }
609
+ this.tabCount = 0;
610
+ }
611
+ }
612
+ handleStdinInput(data) {
613
+ if (data.length > 1 && !isTerminalControlSequence(data)) {
614
+ for (const ch of data)
615
+ this.handleStdinInput(ch);
616
+ return;
617
+ }
618
+ // Arrow keys for line editing
619
+ if (data === '\x1b[D') {
620
+ // Left arrow
621
+ if (this.stdinCursorPos > 0) {
622
+ this.stdinCursorPos--;
623
+ this.terminal.write('\x1b[D');
624
+ }
625
+ return;
626
+ }
627
+ if (data === '\x1b[C') {
628
+ // Right arrow
629
+ if (this.stdinCursorPos < this.stdinLineBuffer.length) {
630
+ this.stdinCursorPos++;
631
+ this.terminal.write('\x1b[C');
632
+ }
633
+ return;
634
+ }
635
+ if (data === '\x1b[H' || data === '\x01') {
636
+ // Home / Ctrl+A
637
+ if (this.stdinCursorPos > 0) {
638
+ this.terminal.write(`\x1b[${this.stdinCursorPos}D`);
639
+ this.stdinCursorPos = 0;
640
+ }
641
+ return;
642
+ }
643
+ if (data === '\x1b[F' || data === '\x05') {
644
+ // End / Ctrl+E
645
+ const diff = this.stdinLineBuffer.length - this.stdinCursorPos;
646
+ if (diff > 0) {
647
+ this.terminal.write(`\x1b[${diff}C`);
648
+ this.stdinCursorPos = this.stdinLineBuffer.length;
649
+ }
650
+ return;
651
+ }
652
+ // Ignore other escape sequences (up/down arrows, etc.)
653
+ if (data.startsWith('\x1b'))
654
+ return;
655
+ // Enter -- feed line to stdin
656
+ if (data === '\r') {
657
+ this.terminal.write('\r\n');
658
+ this.terminalStdin.feed(this.stdinLineBuffer + '\n');
659
+ this.stdinLineBuffer = '';
660
+ this.stdinCursorPos = 0;
661
+ return;
662
+ }
663
+ // Backspace
664
+ if (data === '\x7f' || data === '\b') {
665
+ if (this.stdinCursorPos > 0) {
666
+ const before = this.stdinLineBuffer.slice(0, this.stdinCursorPos - 1);
667
+ const after = this.stdinLineBuffer.slice(this.stdinCursorPos);
668
+ this.stdinLineBuffer = before + after;
669
+ this.stdinCursorPos--;
670
+ // Redraw: move back, write rest + space to clear, reposition cursor
671
+ this.terminal.write('\b' + after + ' ');
672
+ // Move cursor back to position
673
+ const moveBack = after.length + 1;
674
+ if (moveBack > 0) {
675
+ this.terminal.write(`\x1b[${moveBack}D`);
676
+ }
677
+ }
678
+ return;
679
+ }
680
+ // Printable characters
681
+ if (data >= ' ') {
682
+ const before = this.stdinLineBuffer.slice(0, this.stdinCursorPos);
683
+ const after = this.stdinLineBuffer.slice(this.stdinCursorPos);
684
+ this.stdinLineBuffer = before + data + after;
685
+ this.stdinCursorPos += data.length;
686
+ // Write char + rest of line, reposition cursor
687
+ this.terminal.write(data + after);
688
+ if (after.length > 0) {
689
+ this.terminal.write(`\x1b[${after.length}D`);
690
+ }
691
+ }
692
+ }
693
+ applyCompletion(start, end, text) {
694
+ const before = this.lineBuffer.slice(0, start);
695
+ const after = this.lineBuffer.slice(end);
696
+ this.lineBuffer = before + text + after;
697
+ this.cursorPos = start + text.length;
698
+ this.redrawLine();
699
+ }
700
+ getPromptWidth() {
701
+ const { displayPath, user, host } = shellPromptParts(this.env, this.cwd);
702
+ // "user@host:path$ " — count visible chars only (no ANSI codes)
703
+ return user.length + 1 + host.length + 1 + displayPath.length + 2;
704
+ }
705
+ redrawLine() {
706
+ const cols = this.terminal.cols;
707
+ const promptWidth = this.getPromptWidth();
708
+ const totalLen = promptWidth + this.lineBuffer.length;
709
+ // Move up from wherever the cursor actually is to the prompt start row
710
+ if (this.screenCursorRow > 0) {
711
+ this.terminal.write(`\x1b[${this.screenCursorRow}A`);
712
+ }
713
+ this.terminal.write('\r');
714
+ // Clear from here to end of screen
715
+ this.terminal.write('\x1b[J');
716
+ // Rewrite prompt + buffer
717
+ this.terminal.write(formatShellPrompt(this.env, this.cwd));
718
+ this.terminal.write(this.lineBuffer);
719
+ // After writing all content, figure out which row the cursor is on.
720
+ // If content exactly fills N rows, the terminal auto-wraps cursor to the next row.
721
+ let endRow;
722
+ if (totalLen > 0 && totalLen % cols === 0) {
723
+ endRow = totalLen / cols; // cursor wraps to one row past the last content row
724
+ }
725
+ else {
726
+ endRow = Math.floor(totalLen / cols);
727
+ }
728
+ // Position cursor at the desired column
729
+ const desiredCol = promptWidth + this.cursorPos;
730
+ const desiredRow = Math.floor(desiredCol / cols);
731
+ // Move up from content end to desired row
732
+ const rowDiff = endRow - desiredRow;
733
+ if (rowDiff > 0) {
734
+ this.terminal.write(`\x1b[${rowDiff}A`);
735
+ }
736
+ // Move to correct column within the row
737
+ const colInRow = desiredCol % cols;
738
+ this.terminal.write('\r');
739
+ if (colInRow > 0) {
740
+ this.terminal.write(`\x1b[${colInRow}C`);
741
+ }
742
+ // Track where we left the cursor
743
+ this.screenCursorRow = desiredRow;
744
+ }
745
+ /**
746
+ * Replay buffered type-ahead through the line editor. Stops the moment a
747
+ * replayed keystroke starts a command: the rest stays queued and is
748
+ * delivered when that one settles, so a queued line is never fed into a
749
+ * shell that is busy again.
750
+ */
751
+ drainTypeAhead() {
752
+ while (!this.running && this.typeAhead.length > 0) {
753
+ this.handleInput(this.typeAhead.shift());
754
+ }
755
+ }
756
+ drainPasteQueue() {
757
+ const next = this.pasteQueue.shift();
758
+ if (next !== undefined) {
759
+ const line = next.trim();
760
+ if (line) {
761
+ this.terminal.write(line);
762
+ this.terminal.write('\r\n');
763
+ this.history.push(line);
764
+ this.executeLine(line);
765
+ }
766
+ else {
767
+ // Skip empty lines, try next
768
+ this.drainPasteQueue();
769
+ }
770
+ }
771
+ }
772
+ moveCursorLeft() {
773
+ if (this.cursorPos > 0) {
774
+ this.cursorPos--;
775
+ this.terminal.write('\x1b[D');
776
+ }
777
+ }
778
+ moveCursorRight() {
779
+ if (this.cursorPos < this.lineBuffer.length) {
780
+ this.cursorPos++;
781
+ this.terminal.write('\x1b[C');
782
+ }
783
+ }
784
+ moveCursorHome() {
785
+ if (this.cursorPos > 0) {
786
+ this.terminal.write(`\x1b[${this.cursorPos}D`);
787
+ this.cursorPos = 0;
788
+ }
789
+ }
790
+ moveCursorEnd() {
791
+ const diff = this.lineBuffer.length - this.cursorPos;
792
+ if (diff > 0) {
793
+ this.terminal.write(`\x1b[${diff}C`);
794
+ this.cursorPos = this.lineBuffer.length;
795
+ }
796
+ }
797
+ historyUp() {
798
+ if (this.history.length === 0)
799
+ return;
800
+ if (this.historyIndex === -1) {
801
+ this.savedLine = this.lineBuffer;
802
+ this.historyIndex = this.history.length - 1;
803
+ }
804
+ else if (this.historyIndex > 0) {
805
+ this.historyIndex--;
806
+ }
807
+ else {
808
+ return;
809
+ }
810
+ this.lineBuffer = this.history[this.historyIndex];
811
+ this.cursorPos = this.lineBuffer.length;
812
+ this.redrawLine();
813
+ }
814
+ historyDown() {
815
+ if (this.historyIndex === -1)
816
+ return;
817
+ if (this.historyIndex < this.history.length - 1) {
818
+ this.historyIndex++;
819
+ this.lineBuffer = this.history[this.historyIndex];
820
+ }
821
+ else {
822
+ this.historyIndex = -1;
823
+ this.lineBuffer = this.savedLine;
824
+ }
825
+ this.cursorPos = this.lineBuffer.length;
826
+ this.redrawLine();
827
+ }
828
+ async executeLine(line) {
829
+ // History expansion
830
+ const expanded = this.historyManager.expand(line);
831
+ const actualLine = expanded ?? line;
832
+ if (expanded !== null) {
833
+ // Show the expanded command
834
+ this.writeToTerminal(actualLine + '\n');
835
+ }
836
+ // Add to history
837
+ this.historyManager.add(actualLine);
838
+ this.running = true;
839
+ this.abortController = new AbortController();
840
+ this.terminalStdin = new TerminalStdin();
841
+ try {
842
+ await this.interpreter.executeLine(actualLine, this.terminalStdin, {
843
+ commandIdentity: this.commandIdentity,
844
+ runAs: this.commandIdentity.runAs,
845
+ signal: this.abortController.signal,
846
+ });
847
+ }
848
+ finally {
849
+ this.terminalStdin?.close();
850
+ this.terminalStdin = null;
851
+ this.stdinLineBuffer = '';
852
+ this.stdinCursorPos = 0;
853
+ this.running = false;
854
+ this.abortController = null;
855
+ }
856
+ this.printPrompt();
857
+ this.drainPasteQueue();
858
+ this.drainTypeAhead();
859
+ }
860
+ // ─── Builtins (now with stdout/stderr params for pipe support) ───
861
+ async builtinCd(args, stderr) {
862
+ const target = args[0] ?? this.env['HOME'] ?? '/home/user';
863
+ let newPath;
864
+ if (target === '-') {
865
+ newPath = this.env['OLDPWD'] ?? this.cwd;
866
+ }
867
+ else if (target === '~' || target.startsWith('~/')) {
868
+ const home = this.env['HOME'] ?? '/home/user';
869
+ newPath = target === '~' ? home : resolve(home, target.slice(2));
870
+ }
871
+ else {
872
+ newPath = resolve(this.cwd, target);
873
+ }
874
+ try {
875
+ const stat = this.vfs.stat(newPath);
876
+ if (stat.type !== 'directory') {
877
+ stderr.write(`cd: ${target}: Not a directory\n`);
878
+ return 1;
879
+ }
880
+ this.env['OLDPWD'] = this.cwd;
881
+ this.cwd = newPath;
882
+ return 0;
883
+ }
884
+ catch (e) {
885
+ if (e instanceof VFSError) {
886
+ stderr.write(`cd: ${target}: ${e.message}\n`);
887
+ return 1;
888
+ }
889
+ throw e;
890
+ }
891
+ }
892
+ async builtinPwd(stdout) {
893
+ stdout.write(this.cwd + '\n');
894
+ return 0;
895
+ }
896
+ async builtinEcho(args, stdout) {
897
+ let interpretEscapes = false;
898
+ let suppressNewline = false;
899
+ let i = 0;
900
+ while (i < args.length) {
901
+ const arg = args[i];
902
+ if (arg === '--') {
903
+ i++;
904
+ break;
905
+ }
906
+ if (arg === '-n') {
907
+ suppressNewline = true;
908
+ i++;
909
+ continue;
910
+ }
911
+ if (arg === '-e') {
912
+ interpretEscapes = true;
913
+ i++;
914
+ continue;
915
+ }
916
+ if (arg === '-E') {
917
+ interpretEscapes = false;
918
+ i++;
919
+ continue;
920
+ }
921
+ if (isEchoFlagCluster(arg)) {
922
+ for (const ch of arg.slice(1)) {
923
+ if (ch === 'n')
924
+ suppressNewline = true;
925
+ else if (ch === 'e')
926
+ interpretEscapes = true;
927
+ else if (ch === 'E')
928
+ interpretEscapes = false;
929
+ }
930
+ i++;
931
+ continue;
932
+ }
933
+ break;
934
+ }
935
+ const body = args.slice(i).join(' ');
936
+ const output = interpretEscapes ? decodeEchoEscapes(body) : body;
937
+ stdout.write(suppressNewline ? output : `${output}\n`);
938
+ return 0;
939
+ }
940
+ async builtinClear() {
941
+ this.terminal.clear();
942
+ return 0;
943
+ }
944
+ async builtinExport(args, stderr) {
945
+ let exitCode = 0;
946
+ for (const arg of args) {
947
+ const eqIdx = arg.indexOf('=');
948
+ if (eqIdx !== -1) {
949
+ const key = arg.slice(0, eqIdx);
950
+ const value = arg.slice(eqIdx + 1);
951
+ if (!this.assignEnv(key, value, stderr))
952
+ exitCode = 1;
953
+ }
954
+ }
955
+ return exitCode;
956
+ }
957
+ async builtinSet(args, stdout, stderr, context) {
958
+ if (args.length === 0) {
959
+ for (const key of Object.keys(this.env).sort()) {
960
+ stdout.write(`${key}=${quoteSetValue(this.env[key] ?? '')}\n`);
961
+ }
962
+ return 0;
963
+ }
964
+ let positionalsStart = -1;
965
+ for (let i = 0; i < args.length; i++) {
966
+ const arg = args[i];
967
+ if (arg === '--') {
968
+ positionalsStart = i + 1;
969
+ break;
970
+ }
971
+ if (arg === '-') {
972
+ continue;
973
+ }
974
+ if (arg === '-o' || arg === '+o') {
975
+ const option = args[i + 1];
976
+ if (!option) {
977
+ this.printShellOptions(stdout);
978
+ return 0;
979
+ }
980
+ if (!this.setShellOptionByName(option, arg[0] === '-')) {
981
+ stderr.write(`set: ${option}: invalid option name\n`);
982
+ return 2;
983
+ }
984
+ i++;
985
+ continue;
986
+ }
987
+ if (isSetOptionCluster(arg)) {
988
+ const enabled = arg[0] === '-';
989
+ for (let j = 1; j < arg.length; j++) {
990
+ const flag = arg[j];
991
+ if (flag === 'o') {
992
+ const option = j === arg.length - 1 ? args[i + 1] : arg.slice(j + 1);
993
+ if (!option) {
994
+ this.printShellOptions(stdout);
995
+ return 0;
996
+ }
997
+ if (!this.setShellOptionByName(option, enabled)) {
998
+ stderr.write(`set: ${option}: invalid option name\n`);
999
+ return 2;
1000
+ }
1001
+ if (j === arg.length - 1)
1002
+ i++;
1003
+ break;
1004
+ }
1005
+ if (!this.setShellOptionByFlag(flag, enabled)) {
1006
+ stderr.write(`set: -${flag}: invalid option\n`);
1007
+ return 2;
1008
+ }
1009
+ }
1010
+ continue;
1011
+ }
1012
+ positionalsStart = i;
1013
+ break;
1014
+ }
1015
+ if (positionalsStart >= 0) {
1016
+ this.setPositionals(args.slice(positionalsStart), context);
1017
+ }
1018
+ return 0;
1019
+ }
1020
+ async builtinShift(args, stderr, context) {
1021
+ if (args.length > 1) {
1022
+ stderr.write('shift: too many arguments\n');
1023
+ return 1;
1024
+ }
1025
+ const raw = args[0] ?? '1';
1026
+ if (!isDecimalInteger(raw)) {
1027
+ stderr.write(`shift: ${raw}: numeric argument required\n`);
1028
+ return 1;
1029
+ }
1030
+ const count = Number.parseInt(raw, 10);
1031
+ const positionals = this.currentPositionals(context);
1032
+ if (count > positionals.length) {
1033
+ stderr.write('shift: shift count out of range\n');
1034
+ return 1;
1035
+ }
1036
+ this.setPositionals(positionals.slice(count), context);
1037
+ return 0;
1038
+ }
1039
+ async builtinTrap(args, stdout, stderr) {
1040
+ if (args.length === 0) {
1041
+ for (const [signal, action] of this.traps.entries()) {
1042
+ stdout.write(`trap -- ${quoteSetValue(action)} ${signal}\n`);
1043
+ }
1044
+ return 0;
1045
+ }
1046
+ let index = 0;
1047
+ if (args[index] === '--')
1048
+ index++;
1049
+ const action = args[index];
1050
+ if (action === undefined) {
1051
+ stderr.write('trap: missing action\n');
1052
+ return 2;
1053
+ }
1054
+ index++;
1055
+ if (index >= args.length) {
1056
+ stderr.write('trap: missing signal\n');
1057
+ return 2;
1058
+ }
1059
+ for (; index < args.length; index++) {
1060
+ const signal = normalizeTrapSignal(args[index]);
1061
+ if (!signal) {
1062
+ stderr.write(`trap: ${args[index]}: invalid signal\n`);
1063
+ return 2;
1064
+ }
1065
+ if (action === '-')
1066
+ this.traps.delete(signal);
1067
+ else
1068
+ this.traps.set(signal, action);
1069
+ }
1070
+ return 0;
1071
+ }
1072
+ async builtinHash(args, stdout, stderr) {
1073
+ if (args.length === 0 || (args.length === 1 && args[0] === '-r'))
1074
+ return 0;
1075
+ let exitCode = 0;
1076
+ for (const arg of args) {
1077
+ if (arg.startsWith('-')) {
1078
+ stderr.write(`hash: ${arg}: invalid option\n`);
1079
+ exitCode = 2;
1080
+ continue;
1081
+ }
1082
+ const command = await this.registry.resolve(arg);
1083
+ if (!command) {
1084
+ stderr.write(`hash: ${arg}: not found\n`);
1085
+ exitCode = 1;
1086
+ }
1087
+ else {
1088
+ stdout.write(`${arg}\n`);
1089
+ }
1090
+ }
1091
+ return exitCode;
1092
+ }
1093
+ printShellOptions(stdout) {
1094
+ stdout.write(`errexit ${this.shellOptions.errexit ? 'on' : 'off'}\n`);
1095
+ stdout.write(`nounset ${this.shellOptions.nounset ? 'on' : 'off'}\n`);
1096
+ stdout.write(`pipefail ${this.shellOptions.pipefail ? 'on' : 'off'}\n`);
1097
+ }
1098
+ setShellOptionByName(option, enabled) {
1099
+ switch (option) {
1100
+ case 'errexit':
1101
+ this.shellOptions.errexit = enabled;
1102
+ return true;
1103
+ case 'nounset':
1104
+ this.shellOptions.nounset = enabled;
1105
+ return true;
1106
+ case 'pipefail':
1107
+ this.shellOptions.pipefail = enabled;
1108
+ return true;
1109
+ default:
1110
+ return false;
1111
+ }
1112
+ }
1113
+ setShellOptionByFlag(flag, enabled) {
1114
+ switch (flag) {
1115
+ case 'e':
1116
+ this.shellOptions.errexit = enabled;
1117
+ return true;
1118
+ case 'u':
1119
+ this.shellOptions.nounset = enabled;
1120
+ return true;
1121
+ default:
1122
+ return false;
1123
+ }
1124
+ }
1125
+ setPositionals(args, context) {
1126
+ if (context) {
1127
+ context.setPositionals(args);
1128
+ return;
1129
+ }
1130
+ for (const key of Object.keys(this.env)) {
1131
+ if (key === '@' || key === '#' || isPositionalKey(key))
1132
+ delete this.env[key];
1133
+ }
1134
+ this.env['#'] = String(args.length);
1135
+ this.env['@'] = args.join(' ');
1136
+ for (let i = 0; i < args.length; i++) {
1137
+ this.env[String(i + 1)] = args[i];
1138
+ }
1139
+ }
1140
+ currentPositionals(context) {
1141
+ if (context)
1142
+ return [...context.getPositionals()];
1143
+ const count = Number.parseInt(this.env['#'] ?? '0', 10);
1144
+ const args = [];
1145
+ for (let i = 1; i <= count; i++)
1146
+ args.push(this.env[String(i)] ?? '');
1147
+ return args;
1148
+ }
1149
+ async builtinReadonly(args, stdout, stderr) {
1150
+ if (args.length === 0 || (args.length === 1 && args[0] === '-p')) {
1151
+ for (const name of Array.from(this.readonlyNames).sort()) {
1152
+ const value = this.env[name];
1153
+ stdout.write(value === undefined
1154
+ ? `readonly ${name}\n`
1155
+ : `readonly ${name}=${quoteSetValue(value)}\n`);
1156
+ }
1157
+ return 0;
1158
+ }
1159
+ let exitCode = 0;
1160
+ for (const arg of args) {
1161
+ if (arg.startsWith('-')) {
1162
+ stderr.write(`readonly: ${arg}: invalid option\n`);
1163
+ exitCode = 2;
1164
+ continue;
1165
+ }
1166
+ const eqIdx = arg.indexOf('=');
1167
+ if (eqIdx > 0) {
1168
+ const name = arg.slice(0, eqIdx);
1169
+ if (!isShellIdentifier(name)) {
1170
+ stderr.write(`readonly: ${name}: not a valid identifier\n`);
1171
+ exitCode = 1;
1172
+ continue;
1173
+ }
1174
+ if (this.assignEnv(name, arg.slice(eqIdx + 1), stderr)) {
1175
+ this.readonlyNames.add(name);
1176
+ }
1177
+ else {
1178
+ exitCode = 1;
1179
+ }
1180
+ continue;
1181
+ }
1182
+ if (!isShellIdentifier(arg)) {
1183
+ stderr.write(`readonly: ${arg}: not a valid identifier\n`);
1184
+ exitCode = 1;
1185
+ continue;
1186
+ }
1187
+ this.readonlyNames.add(arg);
1188
+ }
1189
+ return exitCode;
1190
+ }
1191
+ async builtinRead(args, stdin, stderr, context) {
1192
+ const options = parseReadArgs(args);
1193
+ if (!options.ok) {
1194
+ stderr.write(`read: ${options.error}\n`);
1195
+ return 1;
1196
+ }
1197
+ if (options.prompt && context?.isFdTerminal(0)) {
1198
+ stderr.write(options.prompt);
1199
+ }
1200
+ const line = await readLineStdin(stdin);
1201
+ if (line === null) {
1202
+ // EOF: bash clears every named variable before returning non-zero.
1203
+ for (const name of options.names) {
1204
+ if (!this.assignEnv(name, '', stderr))
1205
+ return 1;
1206
+ }
1207
+ return 1;
1208
+ }
1209
+ const assignments = splitReadAssignments(line, options.names);
1210
+ for (const [name, value] of assignments) {
1211
+ if (!this.assignEnv(name, value, stderr))
1212
+ return 1;
1213
+ }
1214
+ return 0;
1215
+ }
1216
+ async builtinWait(args, stderr) {
1217
+ const targets = [];
1218
+ for (const arg of args) {
1219
+ const parsed = parseWaitTarget(arg);
1220
+ if (parsed === null) {
1221
+ stderr.write(`wait: ${arg}: not a valid job id\n`);
1222
+ return 127;
1223
+ }
1224
+ targets.push({ value: parsed.value, byJob: parsed.byJob });
1225
+ }
1226
+ const waitables = targets.length === 0
1227
+ ? this.jobTable.list()
1228
+ .filter((job) => job.status === 'running')
1229
+ .map((job) => job.promise)
1230
+ : targets.map((target) => this.resolveWaitTarget(target.value, target.byJob, stderr));
1231
+ let last = 0;
1232
+ for (const waitable of waitables) {
1233
+ if (!waitable) {
1234
+ last = 127;
1235
+ continue;
1236
+ }
1237
+ try {
1238
+ const result = await waitable;
1239
+ last = typeof result === 'number' ? result : 0;
1240
+ }
1241
+ catch {
1242
+ last = 1;
1243
+ }
1244
+ }
1245
+ return last;
1246
+ }
1247
+ resolveWaitTarget(value, byJob, stderr) {
1248
+ if (byJob) {
1249
+ const job = this.jobTable.get(value);
1250
+ if (!job) {
1251
+ stderr.write(`wait: %${value}: no such job\n`);
1252
+ return null;
1253
+ }
1254
+ return job.promise;
1255
+ }
1256
+ const proc = this.processRegistry.get(value);
1257
+ if (proc)
1258
+ return proc.promise;
1259
+ const job = this.jobTable.get(value);
1260
+ if (job)
1261
+ return job.promise;
1262
+ stderr.write(`wait: ${value}: no such process\n`);
1263
+ return null;
1264
+ }
1265
+ async builtinUnset(args, stderr) {
1266
+ let exitCode = 0;
1267
+ for (const arg of args) {
1268
+ // `unset arr[2]` clears one element; `unset arr` removes the variable.
1269
+ const element = /^([a-zA-Z_][a-zA-Z0-9_]*)\[([^\]]*)\]$/.exec(arg);
1270
+ const name = element === null ? arg : element[1];
1271
+ if (!isShellIdentifier(name))
1272
+ continue;
1273
+ if (this.readonlyNames.has(name)) {
1274
+ stderr.write(`${name}: readonly variable\n`);
1275
+ exitCode = 1;
1276
+ continue;
1277
+ }
1278
+ if (element === null) {
1279
+ delete this.env[name];
1280
+ this.arrays.delete(name);
1281
+ continue;
1282
+ }
1283
+ const array = this.arrays.get(name);
1284
+ if (array === undefined)
1285
+ continue;
1286
+ const index = Number.parseInt(element[2], 10);
1287
+ if (Number.isNaN(index))
1288
+ continue;
1289
+ delete array[index < 0 ? array.length + index : index];
1290
+ }
1291
+ return exitCode;
1292
+ }
1293
+ /**
1294
+ * `local name`, `local name=value`, `local name=(word …)` and the `declare` /
1295
+ * `typeset` spellings. `local` binds each name to the running function, so
1296
+ * the value it had outside comes back when the function returns; `declare`
1297
+ * only does so when it is itself inside a function, matching bash.
1298
+ *
1299
+ * Attribute flags (-a -A -i -r -x -g) are accepted. Only -r has an effect —
1300
+ * the rest describe types this shell does not distinguish.
1301
+ */
1302
+ async builtinDeclare(verb, args, stderr, context) {
1303
+ let readonlyFlag = false;
1304
+ let global = false;
1305
+ let exitCode = 0;
1306
+ for (const arg of args) {
1307
+ if (arg.startsWith('-') && arg.length > 1 && !arg.includes('=')) {
1308
+ for (const flag of arg.slice(1)) {
1309
+ if (flag === 'r')
1310
+ readonlyFlag = true;
1311
+ else if (flag === 'g')
1312
+ global = true;
1313
+ else if (!'aAixlunft'.includes(flag)) {
1314
+ stderr.write(`${verb}: -${flag}: invalid option\n`);
1315
+ return 2;
1316
+ }
1317
+ }
1318
+ continue;
1319
+ }
1320
+ const eq = arg.indexOf('=');
1321
+ const name = eq === -1 ? arg : arg.slice(0, eq);
1322
+ if (!isShellIdentifier(name)) {
1323
+ stderr.write(`${verb}: \`${arg}': not a valid identifier\n`);
1324
+ exitCode = 1;
1325
+ continue;
1326
+ }
1327
+ const scope = verb === 'local' || !global;
1328
+ if (scope && context?.declareLocal(name) !== true && verb === 'local') {
1329
+ stderr.write(`${verb}: can only be used in a function\n`);
1330
+ return 1;
1331
+ }
1332
+ if (eq !== -1 && !this.assignDeclared(name, arg.slice(eq + 1), stderr))
1333
+ exitCode = 1;
1334
+ if (readonlyFlag)
1335
+ this.readonlyNames.add(name);
1336
+ }
1337
+ return exitCode;
1338
+ }
1339
+ /** The right-hand side of a declaration: `(word …)` is an array literal. */
1340
+ assignDeclared(name, text, stderr) {
1341
+ if (this.readonlyNames.has(name)) {
1342
+ stderr.write(`${name}: readonly variable\n`);
1343
+ return false;
1344
+ }
1345
+ if (text.startsWith('(') && text.endsWith(')')) {
1346
+ const elements = [];
1347
+ for (const token of lex(text.slice(1, -1))) {
1348
+ if (token.kind === TokenKind.Word)
1349
+ elements.push(unquoteWord(token));
1350
+ }
1351
+ delete this.env[name];
1352
+ this.arrays.set(name, elements);
1353
+ return true;
1354
+ }
1355
+ assignScalar(this.env, this.arrays, name, text);
1356
+ return true;
1357
+ }
1358
+ assignEnv(name, value, stderr) {
1359
+ if (this.readonlyNames.has(name)) {
1360
+ stderr.write(`${name}: readonly variable\n`);
1361
+ return false;
1362
+ }
1363
+ assignScalar(this.env, this.arrays, name, value);
1364
+ return true;
1365
+ }
1366
+ snapshotShellState() {
1367
+ return {
1368
+ cwd: this.cwd,
1369
+ env: { ...this.env },
1370
+ arrays: cloneArrays(this.arrays),
1371
+ shellOptions: { ...this.shellOptions },
1372
+ traps: new Map(this.traps),
1373
+ readonlyNames: new Set(this.readonlyNames),
1374
+ };
1375
+ }
1376
+ restoreShellState(frame) {
1377
+ this.cwd = frame.cwd;
1378
+ replaceRecord(this.env, frame.env);
1379
+ replaceMap(this.arrays, frame.arrays);
1380
+ restoreShellOptions(this.shellOptions, frame.shellOptions);
1381
+ replaceMap(this.traps, frame.traps);
1382
+ replaceSet(this.readonlyNames, frame.readonlyNames);
1383
+ }
1384
+ async builtinExit(args, stderr) {
1385
+ if (args.length > 1) {
1386
+ stderr.write('exit: too many arguments\n');
1387
+ return 1;
1388
+ }
1389
+ if (args.length === 0) {
1390
+ throw new ExitSignal(this.interpreter.getLastExitCode());
1391
+ }
1392
+ const status = parseShellExitStatus(args[0] ?? '');
1393
+ if (status === null) {
1394
+ stderr.write(`exit: ${args[0]}: numeric argument required\n`);
1395
+ throw new ExitSignal(2);
1396
+ }
1397
+ throw new ExitSignal(status);
1398
+ }
1399
+ async builtinJobs(stdout) {
1400
+ const jobs = this.jobTable.list();
1401
+ for (const job of jobs) {
1402
+ stdout.write(`[${job.id}] ${job.status} ${job.command}\n`);
1403
+ }
1404
+ return 0;
1405
+ }
1406
+ async builtinFg(args, stdout, stderr) {
1407
+ const id = args[0] ? parseInt(args[0], 10) : undefined;
1408
+ const jobs = this.jobTable.list();
1409
+ if (jobs.length === 0) {
1410
+ stderr.write('fg: no current job\n');
1411
+ return 1;
1412
+ }
1413
+ const job = id ? this.jobTable.get(id) : jobs[jobs.length - 1];
1414
+ if (!job) {
1415
+ stderr.write(`fg: ${id}: no such job\n`);
1416
+ return 1;
1417
+ }
1418
+ stdout.write(`${job.command}\n`);
1419
+ const exitCode = await job.promise;
1420
+ this.jobTable.remove(job.id);
1421
+ return exitCode;
1422
+ }
1423
+ async builtinBg(args, stdout, stderr) {
1424
+ const id = args[0] ? parseInt(args[0], 10) : undefined;
1425
+ const jobs = this.jobTable.list();
1426
+ if (jobs.length === 0) {
1427
+ stderr.write('bg: no current job\n');
1428
+ return 1;
1429
+ }
1430
+ const job = id ? this.jobTable.get(id) : jobs[jobs.length - 1];
1431
+ if (!job) {
1432
+ stderr.write(`bg: ${id}: no such job\n`);
1433
+ return 1;
1434
+ }
1435
+ stdout.write(`[${job.id}] ${job.command} &\n`);
1436
+ return 0;
1437
+ }
1438
+ async builtinHistory(stdout) {
1439
+ const entries = this.historyManager.getAll();
1440
+ for (let i = 0; i < entries.length; i++) {
1441
+ stdout.write(` ${i + 1} ${entries[i]}\n`);
1442
+ }
1443
+ return 0;
1444
+ }
1445
+ async sourceFile(path) {
1446
+ try {
1447
+ const content = this.vfs.readFileString(path);
1448
+ await this.interpreter.executeLine(content);
1449
+ }
1450
+ catch {
1451
+ // Silently ignore missing config files
1452
+ }
1453
+ }
1454
+ async builtinSource(args, stdout, stderr, context) {
1455
+ if (args.length === 0) {
1456
+ stderr.write('source: missing filename\n');
1457
+ return 1;
1458
+ }
1459
+ const path = resolve(this.cwd, args[0]);
1460
+ let content;
1461
+ try {
1462
+ content = this.vfs.readFileString(path);
1463
+ }
1464
+ catch {
1465
+ stderr.write(`source: ${args[0]}: No such file\n`);
1466
+ return 1;
1467
+ }
1468
+ if (!context) {
1469
+ stderr.write('source: execution context unavailable\n');
1470
+ return 1;
1471
+ }
1472
+ const sourceArgs = args.slice(1);
1473
+ return context.executeInline(content, sourceArgs.length > 0 ? { positionals: sourceArgs } : undefined);
1474
+ }
1475
+ async builtinAlias(args, stdout) {
1476
+ if (args.length === 0) {
1477
+ for (const [name, value] of this.aliases) {
1478
+ stdout.write(`alias ${name}='${value}'\n`);
1479
+ }
1480
+ return 0;
1481
+ }
1482
+ for (const arg of args) {
1483
+ const eqIdx = arg.indexOf('=');
1484
+ if (eqIdx !== -1) {
1485
+ const name = arg.slice(0, eqIdx);
1486
+ const value = arg.slice(eqIdx + 1);
1487
+ this.aliases.set(name, value);
1488
+ }
1489
+ else {
1490
+ const value = this.aliases.get(arg);
1491
+ if (value !== undefined) {
1492
+ stdout.write(`alias ${arg}='${value}'\n`);
1493
+ }
1494
+ else {
1495
+ stdout.write(`alias: ${arg}: not found\n`);
1496
+ }
1497
+ }
1498
+ }
1499
+ return 0;
1500
+ }
1501
+ async builtinUnalias(args, stderr) {
1502
+ if (args.length === 0) {
1503
+ stderr.write('unalias: usage: unalias name ...\n');
1504
+ return 1;
1505
+ }
1506
+ for (const name of args) {
1507
+ if (!this.aliases.delete(name)) {
1508
+ stderr.write(`unalias: ${name}: not found\n`);
1509
+ }
1510
+ }
1511
+ return 0;
1512
+ }
1513
+ writeToTerminal(text) {
1514
+ this.terminal.write(normalizeTerminalNewlines(text));
1515
+ }
1516
+ }
1517
+ function isEchoFlagCluster(arg) {
1518
+ if (arg.length < 2 || arg[0] !== '-')
1519
+ return false;
1520
+ for (const ch of arg.slice(1)) {
1521
+ if (ch !== 'n' && ch !== 'e' && ch !== 'E')
1522
+ return false;
1523
+ }
1524
+ return true;
1525
+ }
1526
+ function decodeEchoEscapes(input) {
1527
+ let output = '';
1528
+ for (let i = 0; i < input.length; i++) {
1529
+ const ch = input[i];
1530
+ if (ch !== '\\' || i + 1 >= input.length) {
1531
+ output += ch;
1532
+ continue;
1533
+ }
1534
+ const next = input[++i];
1535
+ switch (next) {
1536
+ case '\\':
1537
+ output += '\\';
1538
+ break;
1539
+ case 'n':
1540
+ output += '\n';
1541
+ break;
1542
+ case 't':
1543
+ output += '\t';
1544
+ break;
1545
+ case 'r':
1546
+ output += '\r';
1547
+ break;
1548
+ case 'b':
1549
+ output += '\b';
1550
+ break;
1551
+ case 'f':
1552
+ output += '\f';
1553
+ break;
1554
+ case 'v':
1555
+ output += '\v';
1556
+ break;
1557
+ case 'a':
1558
+ output += '\x07';
1559
+ break;
1560
+ case 'x': {
1561
+ const parsed = readHexEscape(input, i + 1);
1562
+ if (parsed) {
1563
+ output += String.fromCharCode(parsed.value);
1564
+ i = parsed.end - 1;
1565
+ }
1566
+ else {
1567
+ output += 'x';
1568
+ }
1569
+ break;
1570
+ }
1571
+ case '0': {
1572
+ const parsed = readOctalEscape(input, i + 1);
1573
+ output += String.fromCharCode(parsed.value);
1574
+ i = parsed.end - 1;
1575
+ break;
1576
+ }
1577
+ default:
1578
+ output += next;
1579
+ break;
1580
+ }
1581
+ }
1582
+ return output;
1583
+ }
1584
+ function readHexEscape(input, pos) {
1585
+ let value = 0;
1586
+ let end = pos;
1587
+ while (end < input.length && end - pos < 2) {
1588
+ const digit = hexValue(input.charCodeAt(end));
1589
+ if (digit === null)
1590
+ break;
1591
+ value = value * 16 + digit;
1592
+ end++;
1593
+ }
1594
+ return end === pos ? null : { value, end };
1595
+ }
1596
+ function readOctalEscape(input, pos) {
1597
+ let value = 0;
1598
+ let end = pos;
1599
+ while (end < input.length && end - pos < 3) {
1600
+ const code = input.charCodeAt(end);
1601
+ if (code < 48 || code > 55)
1602
+ break;
1603
+ value = value * 8 + (code - 48);
1604
+ end++;
1605
+ }
1606
+ return { value, end };
1607
+ }
1608
+ function hexValue(code) {
1609
+ if (code >= 48 && code <= 57)
1610
+ return code - 48;
1611
+ if (code >= 65 && code <= 70)
1612
+ return code - 55;
1613
+ if (code >= 97 && code <= 102)
1614
+ return code - 87;
1615
+ return null;
1616
+ }
1617
+ function parseReadArgs(args) {
1618
+ const names = [];
1619
+ let prompt;
1620
+ let parsingOptions = true;
1621
+ for (let i = 0; i < args.length; i++) {
1622
+ const arg = args[i];
1623
+ if (parsingOptions && arg === '--') {
1624
+ parsingOptions = false;
1625
+ continue;
1626
+ }
1627
+ if (parsingOptions && arg.startsWith('-') && arg !== '-') {
1628
+ if (arg === '-r')
1629
+ continue;
1630
+ if (arg === '-p' || arg === '-rp' || arg === '-pr') {
1631
+ const next = args[++i];
1632
+ if (next === undefined)
1633
+ return { ok: false, error: `${arg}: option requires an argument` };
1634
+ prompt = next;
1635
+ continue;
1636
+ }
1637
+ if (arg.startsWith('-p') && arg.length > 2) {
1638
+ prompt = arg.slice(2);
1639
+ continue;
1640
+ }
1641
+ return { ok: false, error: `${arg}: unsupported option` };
1642
+ }
1643
+ parsingOptions = false;
1644
+ names.push(arg);
1645
+ }
1646
+ const resolvedNames = names.length > 0 ? names : ['REPLY'];
1647
+ for (const name of resolvedNames) {
1648
+ if (!isShellIdentifier(name))
1649
+ return { ok: false, error: `${name}: not a valid identifier` };
1650
+ }
1651
+ return prompt === undefined
1652
+ ? { ok: true, names: resolvedNames }
1653
+ : { ok: true, names: resolvedNames, prompt };
1654
+ }
1655
+ async function readLineStdin(stdin) {
1656
+ if (!stdin)
1657
+ return null;
1658
+ if (stdin.readLine)
1659
+ return stdin.readLine();
1660
+ let line = '';
1661
+ let readChunk = false;
1662
+ while (true) {
1663
+ const chunk = await stdin.read();
1664
+ if (chunk === null)
1665
+ break;
1666
+ readChunk = true;
1667
+ const newline = chunk.indexOf('\n');
1668
+ if (newline >= 0)
1669
+ return line + chunk.slice(0, newline);
1670
+ line += chunk;
1671
+ }
1672
+ if (readChunk)
1673
+ return line;
1674
+ const content = await stdin.readAll();
1675
+ if (content.length === 0)
1676
+ return null;
1677
+ const newline = content.indexOf('\n');
1678
+ return newline >= 0 ? content.slice(0, newline) : content;
1679
+ }
1680
+ function splitReadAssignments(line, names) {
1681
+ if (names.length === 1)
1682
+ return [[names[0], line]];
1683
+ const fields = splitWhitespaceFields(line);
1684
+ const assignments = [];
1685
+ for (let i = 0; i < names.length; i++) {
1686
+ if (i === names.length - 1) {
1687
+ assignments.push([names[i], fields.slice(i).join(' ')]);
1688
+ }
1689
+ else {
1690
+ assignments.push([names[i], fields[i] ?? '']);
1691
+ }
1692
+ }
1693
+ return assignments;
1694
+ }
1695
+ function splitWhitespaceFields(line) {
1696
+ const fields = [];
1697
+ let current = '';
1698
+ for (let i = 0; i < line.length; i++) {
1699
+ const code = line.charCodeAt(i);
1700
+ const whitespace = code === 32 || code === 9;
1701
+ if (whitespace) {
1702
+ if (current.length > 0) {
1703
+ fields.push(current);
1704
+ current = '';
1705
+ }
1706
+ }
1707
+ else {
1708
+ current += line[i];
1709
+ }
1710
+ }
1711
+ if (current.length > 0)
1712
+ fields.push(current);
1713
+ return fields;
1714
+ }
1715
+ function isTerminalControlSequence(data) {
1716
+ return data.startsWith('\x1b[') || data.startsWith('\x1b(') || data.startsWith('\x1b)');
1717
+ }
1718
+ function parseWaitTarget(arg) {
1719
+ const byJob = arg[0] === '%';
1720
+ const text = byJob ? arg.slice(1) : arg;
1721
+ if (!isDecimalInteger(text))
1722
+ return null;
1723
+ return { value: Number.parseInt(text, 10), byJob };
1724
+ }
1725
+ /** A lexed word's text with its quoting removed, the way expansion leaves it. */
1726
+ function unquoteWord(token) {
1727
+ return token.parts === undefined ? token.value : token.parts.map((p) => p.text).join('');
1728
+ }
1729
+ function isShellIdentifier(value) {
1730
+ if (value.length === 0)
1731
+ return false;
1732
+ const first = value.charCodeAt(0);
1733
+ if (!isIdentifierStart(first))
1734
+ return false;
1735
+ for (let i = 1; i < value.length; i++) {
1736
+ if (!isIdentifierPart(value.charCodeAt(i)))
1737
+ return false;
1738
+ }
1739
+ return true;
1740
+ }
1741
+ function isPositionalKey(key) {
1742
+ return isDecimalInteger(key);
1743
+ }
1744
+ function isSetOptionCluster(arg) {
1745
+ if (arg.length < 2)
1746
+ return false;
1747
+ if (arg[0] !== '-' && arg[0] !== '+')
1748
+ return false;
1749
+ return arg !== '--' && arg !== '++';
1750
+ }
1751
+ function normalizeTrapSignal(raw) {
1752
+ const signal = raw.toUpperCase();
1753
+ if (signal === '0' || signal === 'EXIT')
1754
+ return 'EXIT';
1755
+ if (signal.startsWith('SIG') && signal.length > 3)
1756
+ return signal.slice(3);
1757
+ if (isShellIdentifier(signal))
1758
+ return signal;
1759
+ return null;
1760
+ }
1761
+ function quoteSetValue(value) {
1762
+ if (value.length === 0)
1763
+ return "''";
1764
+ if (isPlainSetValue(value))
1765
+ return value;
1766
+ return `'${value.replace(/'/g, "'\\''")}'`;
1767
+ }
1768
+ function isPlainSetValue(value) {
1769
+ for (let i = 0; i < value.length; i++) {
1770
+ const code = value.charCodeAt(i);
1771
+ const ok = (code >= 48 && code <= 57) ||
1772
+ (code >= 65 && code <= 90) ||
1773
+ (code >= 97 && code <= 122) ||
1774
+ code === 95 ||
1775
+ code === 45 ||
1776
+ code === 46 ||
1777
+ code === 47 ||
1778
+ code === 58;
1779
+ if (!ok)
1780
+ return false;
1781
+ }
1782
+ return true;
1783
+ }
1784
+ function isIdentifierStart(code) {
1785
+ return code === 95 || (code >= 65 && code <= 90) || (code >= 97 && code <= 122);
1786
+ }
1787
+ function isIdentifierPart(code) {
1788
+ return isIdentifierStart(code) || (code >= 48 && code <= 57);
1789
+ }
1790
+ function isDecimalInteger(value) {
1791
+ if (value.length === 0)
1792
+ return false;
1793
+ for (let i = 0; i < value.length; i++) {
1794
+ const code = value.charCodeAt(i);
1795
+ if (code < 48 || code > 57)
1796
+ return false;
1797
+ }
1798
+ return true;
1799
+ }
1800
+ function parseShellExitStatus(raw) {
1801
+ if (raw.length === 0)
1802
+ return null;
1803
+ const sign = raw[0] === '-' ? -1n : 1n;
1804
+ const digits = raw[0] === '-' || raw[0] === '+' ? raw.slice(1) : raw;
1805
+ if (!isDecimalInteger(digits))
1806
+ return null;
1807
+ const value = BigInt(digits) * sign;
1808
+ const normalized = ((value % 256n) + 256n) % 256n;
1809
+ return Number(normalized);
1810
+ }
1811
+ function snapshotEnvKeys(env, keys) {
1812
+ const snapshot = new Map();
1813
+ for (const key of keys)
1814
+ snapshot.set(key, env[key]);
1815
+ return snapshot;
1816
+ }
1817
+ function restoreEnvKeys(env, snapshot) {
1818
+ for (const [key, value] of snapshot.entries()) {
1819
+ if (value === undefined)
1820
+ delete env[key];
1821
+ else
1822
+ env[key] = value;
1823
+ }
1824
+ }
1825
+ function replaceRecord(target, source) {
1826
+ for (const key of Object.keys(target))
1827
+ delete target[key];
1828
+ Object.assign(target, source);
1829
+ }
1830
+ function restoreShellOptions(target, source) {
1831
+ target.errexit = source.errexit;
1832
+ target.nounset = source.nounset;
1833
+ target.pipefail = source.pipefail;
1834
+ }
1835
+ /** Arrays are mutated in place, so a snapshot has to copy each one. */
1836
+ function cloneArrays(arrays) {
1837
+ const copy = new Map();
1838
+ for (const [name, elements] of arrays)
1839
+ copy.set(name, [...elements]);
1840
+ return copy;
1841
+ }
1842
+ function replaceMap(target, source) {
1843
+ target.clear();
1844
+ for (const [key, value] of source.entries())
1845
+ target.set(key, value);
1846
+ }
1847
+ function replaceSet(target, source) {
1848
+ target.clear();
1849
+ for (const value of source.values())
1850
+ target.add(value);
1851
+ }
1852
+ function isVfsCred(value) {
1853
+ if (typeof value !== 'object' || value === null)
1854
+ return false;
1855
+ if (!('uid' in value) || typeof value.uid !== 'number')
1856
+ return false;
1857
+ if (!('gid' in value) || typeof value.gid !== 'number')
1858
+ return false;
1859
+ if (!('umask' in value) || typeof value.umask !== 'number')
1860
+ return false;
1861
+ return 'groups' in value && Array.isArray(value.groups)
1862
+ && value.groups.every((group) => typeof group === 'number');
1863
+ }