typescript-virtual-container 1.2.8 → 1.3.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 (307) hide show
  1. package/.vscode/settings.json +0 -1
  2. package/README.md +462 -44
  3. package/biome.json +7 -0
  4. package/dist/SSHMimic/exec.d.ts.map +1 -1
  5. package/dist/SSHMimic/executor.d.ts.map +1 -1
  6. package/dist/SSHMimic/executor.js +35 -21
  7. package/dist/SSHMimic/index.d.ts.map +1 -1
  8. package/dist/SSHMimic/index.js +20 -6
  9. package/dist/VirtualFileSystem/binaryPack.d.ts.map +1 -1
  10. package/dist/VirtualFileSystem/binaryPack.js +29 -6
  11. package/dist/VirtualFileSystem/index.d.ts.map +1 -1
  12. package/dist/VirtualFileSystem/index.js +36 -13
  13. package/dist/VirtualPackageManager/index.d.ts +202 -0
  14. package/dist/VirtualPackageManager/index.d.ts.map +1 -0
  15. package/dist/VirtualPackageManager/index.js +825 -0
  16. package/dist/VirtualShell/index.d.ts +93 -12
  17. package/dist/VirtualShell/index.d.ts.map +1 -1
  18. package/dist/VirtualShell/index.js +95 -13
  19. package/dist/VirtualShell/shell.d.ts.map +1 -1
  20. package/dist/VirtualShell/shell.js +3 -1
  21. package/dist/VirtualShell/shellParser.d.ts.map +1 -1
  22. package/dist/VirtualUserManager/index.d.ts +52 -20
  23. package/dist/VirtualUserManager/index.d.ts.map +1 -1
  24. package/dist/VirtualUserManager/index.js +54 -20
  25. package/dist/commands/adduser.d.ts +6 -0
  26. package/dist/commands/adduser.d.ts.map +1 -1
  27. package/dist/commands/adduser.js +6 -0
  28. package/dist/commands/alias.d.ts +9 -0
  29. package/dist/commands/alias.d.ts.map +1 -0
  30. package/dist/commands/alias.js +63 -0
  31. package/dist/commands/apt.d.ts +9 -0
  32. package/dist/commands/apt.d.ts.map +1 -0
  33. package/dist/commands/apt.js +205 -0
  34. package/dist/commands/awk.d.ts +11 -0
  35. package/dist/commands/awk.d.ts.map +1 -1
  36. package/dist/commands/awk.js +15 -2
  37. package/dist/commands/base64.d.ts +5 -0
  38. package/dist/commands/base64.d.ts.map +1 -1
  39. package/dist/commands/base64.js +9 -1
  40. package/dist/commands/cat.d.ts +5 -0
  41. package/dist/commands/cat.d.ts.map +1 -1
  42. package/dist/commands/cat.js +35 -8
  43. package/dist/commands/cd.d.ts +5 -0
  44. package/dist/commands/cd.d.ts.map +1 -1
  45. package/dist/commands/cd.js +5 -0
  46. package/dist/commands/chmod.d.ts +5 -0
  47. package/dist/commands/chmod.d.ts.map +1 -1
  48. package/dist/commands/chmod.js +57 -3
  49. package/dist/commands/command-helpers.d.ts +78 -4
  50. package/dist/commands/command-helpers.d.ts.map +1 -1
  51. package/dist/commands/command-helpers.js +78 -4
  52. package/dist/commands/cp.d.ts +5 -0
  53. package/dist/commands/cp.d.ts.map +1 -1
  54. package/dist/commands/cp.js +5 -0
  55. package/dist/commands/curl.d.ts +5 -0
  56. package/dist/commands/curl.d.ts.map +1 -1
  57. package/dist/commands/curl.js +106 -26
  58. package/dist/commands/cut.d.ts +5 -0
  59. package/dist/commands/cut.d.ts.map +1 -1
  60. package/dist/commands/cut.js +8 -1
  61. package/dist/commands/date.d.ts +5 -0
  62. package/dist/commands/date.d.ts.map +1 -1
  63. package/dist/commands/date.js +7 -1
  64. package/dist/commands/declare.d.ts +3 -0
  65. package/dist/commands/declare.d.ts.map +1 -0
  66. package/dist/commands/declare.js +39 -0
  67. package/dist/commands/diff.d.ts +5 -0
  68. package/dist/commands/diff.d.ts.map +1 -1
  69. package/dist/commands/diff.js +5 -0
  70. package/dist/commands/dpkg.d.ts +9 -0
  71. package/dist/commands/dpkg.d.ts.map +1 -0
  72. package/dist/commands/dpkg.js +161 -0
  73. package/dist/commands/du.d.ts.map +1 -1
  74. package/dist/commands/du.js +8 -2
  75. package/dist/commands/echo.d.ts +5 -0
  76. package/dist/commands/echo.d.ts.map +1 -1
  77. package/dist/commands/echo.js +33 -12
  78. package/dist/commands/env.d.ts +5 -0
  79. package/dist/commands/env.d.ts.map +1 -1
  80. package/dist/commands/env.js +11 -1
  81. package/dist/commands/exit.d.ts +5 -0
  82. package/dist/commands/exit.d.ts.map +1 -1
  83. package/dist/commands/exit.js +12 -2
  84. package/dist/commands/export.d.ts.map +1 -1
  85. package/dist/commands/export.js +3 -1
  86. package/dist/commands/find.d.ts +5 -0
  87. package/dist/commands/find.d.ts.map +1 -1
  88. package/dist/commands/find.js +5 -0
  89. package/dist/commands/free.d.ts +8 -0
  90. package/dist/commands/free.d.ts.map +1 -0
  91. package/dist/commands/free.js +43 -0
  92. package/dist/commands/grep.d.ts +5 -0
  93. package/dist/commands/grep.d.ts.map +1 -1
  94. package/dist/commands/grep.js +12 -2
  95. package/dist/commands/gzip.d.ts +5 -0
  96. package/dist/commands/gzip.d.ts.map +1 -1
  97. package/dist/commands/gzip.js +18 -2
  98. package/dist/commands/head.d.ts +5 -0
  99. package/dist/commands/head.d.ts.map +1 -1
  100. package/dist/commands/head.js +5 -0
  101. package/dist/commands/help.d.ts.map +1 -1
  102. package/dist/commands/help.js +98 -45
  103. package/dist/commands/helpers.d.ts +3 -0
  104. package/dist/commands/helpers.d.ts.map +1 -1
  105. package/dist/commands/helpers.js +3 -0
  106. package/dist/commands/history.d.ts +8 -0
  107. package/dist/commands/history.d.ts.map +1 -0
  108. package/dist/commands/history.js +26 -0
  109. package/dist/commands/hostname.d.ts +5 -0
  110. package/dist/commands/hostname.d.ts.map +1 -1
  111. package/dist/commands/hostname.js +5 -0
  112. package/dist/commands/id.d.ts.map +1 -1
  113. package/dist/commands/id.js +4 -1
  114. package/dist/commands/index.d.ts +2 -10
  115. package/dist/commands/index.d.ts.map +1 -1
  116. package/dist/commands/index.js +2 -231
  117. package/dist/commands/ls.d.ts.map +1 -1
  118. package/dist/commands/ls.js +6 -3
  119. package/dist/commands/lsb-release.d.ts +3 -0
  120. package/dist/commands/lsb-release.d.ts.map +1 -0
  121. package/dist/commands/lsb-release.js +56 -0
  122. package/dist/commands/man.d.ts +3 -0
  123. package/dist/commands/man.d.ts.map +1 -0
  124. package/dist/commands/man.js +155 -0
  125. package/dist/commands/nano.js +1 -1
  126. package/dist/commands/neofetch.d.ts.map +1 -1
  127. package/dist/commands/neofetch.js +6 -1
  128. package/dist/commands/node.d.ts +9 -0
  129. package/dist/commands/node.d.ts.map +1 -0
  130. package/dist/commands/node.js +316 -0
  131. package/dist/commands/npm.d.ts +19 -0
  132. package/dist/commands/npm.d.ts.map +1 -0
  133. package/dist/commands/npm.js +109 -0
  134. package/dist/commands/ping.d.ts.map +1 -1
  135. package/dist/commands/ping.js +7 -2
  136. package/dist/commands/printf.d.ts +3 -0
  137. package/dist/commands/printf.d.ts.map +1 -0
  138. package/dist/commands/printf.js +113 -0
  139. package/dist/commands/ps.d.ts.map +1 -1
  140. package/dist/commands/ps.js +30 -6
  141. package/dist/commands/python.d.ts +30 -0
  142. package/dist/commands/python.d.ts.map +1 -0
  143. package/dist/commands/python.js +2058 -0
  144. package/dist/commands/read.d.ts +3 -0
  145. package/dist/commands/read.d.ts.map +1 -0
  146. package/dist/commands/read.js +34 -0
  147. package/dist/commands/registry.d.ts +8 -0
  148. package/dist/commands/registry.d.ts.map +1 -0
  149. package/dist/commands/registry.js +229 -0
  150. package/dist/commands/runtime.d.ts +6 -0
  151. package/dist/commands/runtime.d.ts.map +1 -0
  152. package/dist/commands/runtime.js +280 -0
  153. package/dist/commands/sed.d.ts.map +1 -1
  154. package/dist/commands/sed.js +11 -3
  155. package/dist/commands/set.d.ts.map +1 -1
  156. package/dist/commands/set.js +9 -3
  157. package/dist/commands/sh.d.ts.map +1 -1
  158. package/dist/commands/sh.js +69 -30
  159. package/dist/commands/shift.d.ts +5 -0
  160. package/dist/commands/shift.d.ts.map +1 -0
  161. package/dist/commands/shift.js +52 -0
  162. package/dist/commands/sleep.d.ts.map +1 -1
  163. package/dist/commands/sort.d.ts.map +1 -1
  164. package/dist/commands/sort.js +4 -2
  165. package/dist/commands/source.d.ts +3 -0
  166. package/dist/commands/source.d.ts.map +1 -0
  167. package/dist/commands/source.js +34 -0
  168. package/dist/commands/sudo.js +1 -1
  169. package/dist/commands/tar.d.ts.map +1 -1
  170. package/dist/commands/tar.js +11 -3
  171. package/dist/commands/tee.d.ts.map +1 -1
  172. package/dist/commands/tee.js +8 -6
  173. package/dist/commands/test.d.ts +3 -0
  174. package/dist/commands/test.d.ts.map +1 -0
  175. package/dist/commands/test.js +114 -0
  176. package/dist/commands/tr.d.ts.map +1 -1
  177. package/dist/commands/tr.js +3 -1
  178. package/dist/commands/true.d.ts +4 -0
  179. package/dist/commands/true.d.ts.map +1 -0
  180. package/dist/commands/true.js +14 -0
  181. package/dist/commands/type.d.ts +3 -0
  182. package/dist/commands/type.d.ts.map +1 -0
  183. package/dist/commands/type.js +34 -0
  184. package/dist/commands/uname.d.ts.map +1 -1
  185. package/dist/commands/uname.js +4 -1
  186. package/dist/commands/uniq.d.ts.map +1 -1
  187. package/dist/commands/uptime.d.ts +3 -0
  188. package/dist/commands/uptime.d.ts.map +1 -0
  189. package/dist/commands/uptime.js +43 -0
  190. package/dist/commands/wget.d.ts.map +1 -1
  191. package/dist/commands/wget.js +92 -96
  192. package/dist/commands/which.d.ts +3 -0
  193. package/dist/commands/which.d.ts.map +1 -0
  194. package/dist/commands/which.js +32 -0
  195. package/dist/commands/xargs.d.ts.map +1 -1
  196. package/dist/commands/xargs.js +1 -1
  197. package/dist/index.d.ts +15 -11
  198. package/dist/index.d.ts.map +1 -1
  199. package/dist/index.js +9 -8
  200. package/dist/modules/linuxRootfs.d.ts +41 -0
  201. package/dist/modules/linuxRootfs.d.ts.map +1 -0
  202. package/dist/modules/linuxRootfs.js +440 -0
  203. package/dist/modules/neofetch.d.ts.map +1 -1
  204. package/dist/modules/neofetch.js +1 -0
  205. package/dist/standalone-wo-sftp.d.ts +2 -0
  206. package/dist/standalone-wo-sftp.d.ts.map +1 -0
  207. package/dist/standalone-wo-sftp.js +30 -0
  208. package/dist/utils/expand.d.ts +50 -0
  209. package/dist/utils/expand.d.ts.map +1 -0
  210. package/dist/utils/expand.js +183 -0
  211. package/dist/utils/vfsDiff.d.ts +90 -0
  212. package/dist/utils/vfsDiff.d.ts.map +1 -0
  213. package/dist/utils/vfsDiff.js +177 -0
  214. package/package.json +3 -1
  215. package/src/SSHMimic/exec.ts +10 -1
  216. package/src/SSHMimic/executor.ts +105 -21
  217. package/src/SSHMimic/index.ts +49 -15
  218. package/src/VirtualFileSystem/binaryPack.ts +35 -8
  219. package/src/VirtualFileSystem/index.ts +78 -28
  220. package/src/VirtualPackageManager/index.ts +979 -0
  221. package/src/VirtualShell/index.ts +133 -14
  222. package/src/VirtualShell/shell.ts +23 -3
  223. package/src/VirtualShell/shellParser.ts +134 -36
  224. package/src/VirtualUserManager/index.ts +62 -22
  225. package/src/commands/adduser.ts +6 -0
  226. package/src/commands/alias.ts +64 -0
  227. package/src/commands/apt.ts +228 -0
  228. package/src/commands/awk.ts +20 -6
  229. package/src/commands/base64.ts +13 -2
  230. package/src/commands/cat.ts +40 -8
  231. package/src/commands/cd.ts +5 -0
  232. package/src/commands/chmod.ts +53 -3
  233. package/src/commands/command-helpers.ts +78 -4
  234. package/src/commands/cp.ts +5 -0
  235. package/src/commands/curl.ts +118 -33
  236. package/src/commands/cut.ts +8 -1
  237. package/src/commands/date.ts +7 -1
  238. package/src/commands/declare.ts +44 -0
  239. package/src/commands/diff.ts +17 -3
  240. package/src/commands/dpkg.ts +180 -0
  241. package/src/commands/du.ts +17 -5
  242. package/src/commands/echo.ts +41 -12
  243. package/src/commands/env.ts +11 -1
  244. package/src/commands/exit.ts +12 -2
  245. package/src/commands/export.ts +3 -1
  246. package/src/commands/find.ts +5 -0
  247. package/src/commands/free.ts +47 -0
  248. package/src/commands/grep.ts +12 -2
  249. package/src/commands/gzip.ts +28 -4
  250. package/src/commands/head.ts +5 -0
  251. package/src/commands/help.ts +121 -47
  252. package/src/commands/helpers.ts +8 -0
  253. package/src/commands/history.ts +34 -0
  254. package/src/commands/hostname.ts +5 -0
  255. package/src/commands/id.ts +4 -1
  256. package/src/commands/index.ts +9 -255
  257. package/src/commands/ls.ts +6 -3
  258. package/src/commands/lsb-release.ts +58 -0
  259. package/src/commands/man.ts +166 -0
  260. package/src/commands/nano.ts +1 -1
  261. package/src/commands/neofetch.ts +6 -1
  262. package/src/commands/node.ts +341 -0
  263. package/src/commands/npm.ts +132 -0
  264. package/src/commands/ping.ts +10 -3
  265. package/src/commands/printf.ts +112 -0
  266. package/src/commands/ps.ts +40 -6
  267. package/src/commands/python.ts +2229 -0
  268. package/src/commands/read.ts +41 -0
  269. package/src/commands/registry.ts +244 -0
  270. package/src/commands/runtime.ts +353 -0
  271. package/src/commands/sed.ts +27 -9
  272. package/src/commands/set.ts +9 -3
  273. package/src/commands/sh.ts +170 -44
  274. package/src/commands/shift.ts +53 -0
  275. package/src/commands/sleep.ts +2 -1
  276. package/src/commands/sort.ts +10 -6
  277. package/src/commands/source.ts +47 -0
  278. package/src/commands/sudo.ts +1 -1
  279. package/src/commands/tar.ts +28 -7
  280. package/src/commands/tee.ts +7 -1
  281. package/src/commands/test.ts +135 -0
  282. package/src/commands/tr.ts +3 -1
  283. package/src/commands/true.ts +17 -0
  284. package/src/commands/type.ts +43 -0
  285. package/src/commands/uname.ts +5 -1
  286. package/src/commands/uniq.ts +8 -2
  287. package/src/commands/uptime.ts +49 -0
  288. package/src/commands/wget.ts +105 -119
  289. package/src/commands/which.ts +37 -0
  290. package/src/commands/xargs.ts +11 -2
  291. package/src/index.ts +27 -18
  292. package/src/modules/linuxRootfs.ts +642 -0
  293. package/src/modules/neofetch.ts +1 -0
  294. package/src/standalone-wo-sftp.ts +38 -0
  295. package/src/utils/expand.ts +238 -0
  296. package/src/utils/vfsDiff.ts +275 -0
  297. package/standalone-wo-sftp.js +507 -0
  298. package/standalone-wo-sftp.js.map +7 -0
  299. package/standalone.js +486 -109
  300. package/standalone.js.map +4 -4
  301. package/tests/bun-test-shim.ts +9 -1
  302. package/tests/command-helpers.test.ts +1 -5
  303. package/tests/new-features.test.ts +1036 -0
  304. package/tests/parser-executor.test.ts +27 -27
  305. package/tests/sftp.test.ts +122 -42
  306. package/tests/users.test.ts +23 -5
  307. package/CHANGELOG.md +0 -150
package/biome.json CHANGED
@@ -26,5 +26,12 @@
26
26
  "indentWidth": 2,
27
27
  "lineWidth": 80,
28
28
  "lineEnding": "lf"
29
+ },
30
+ "files": {
31
+ "ignoreUnknown": true,
32
+ "includes": [
33
+ "**/*.ts",
34
+ "**/*.tsx"
35
+ ]
29
36
  }
30
37
  }
@@ -1 +1 @@
1
- {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/SSHMimic/exec.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AASpD,wBAAgB,OAAO,CACtB,MAAM,EAAE,UAAU,EAClB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,YAAY,GACjB,IAAI,CAuBN"}
1
+ {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/SSHMimic/exec.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AASpD,wBAAgB,OAAO,CACtB,MAAM,EAAE,UAAU,EAClB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,YAAY,GACjB,IAAI,CAgCN"}
@@ -1 +1 @@
1
- {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/SSHMimic/executor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC9E,OAAO,KAAK,EAAE,QAAQ,EAAmB,MAAM,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACtF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAIpD,wBAAsB,aAAa,CAClC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,YAAY,EACnB,GAAG,EAAE,QAAQ,GACX,OAAO,CAAC,aAAa,CAAC,CAiBxB;AAED,8CAA8C;AAC9C,wBAAsB,iBAAiB,CACtC,UAAU,EAAE,SAAS,EAAE,EACvB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,YAAY,EACnB,GAAG,EAAE,QAAQ,GACX,OAAO,CAAC,aAAa,CAAC,CA4BxB;AAID,wBAAsB,eAAe,CACpC,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,YAAY,EACnB,GAAG,CAAC,EAAE,QAAQ,GACZ,OAAO,CAAC,aAAa,CAAC,CAiBxB"}
1
+ {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/SSHMimic/executor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC9E,OAAO,KAAK,EACX,QAAQ,EAER,MAAM,EACN,SAAS,EACT,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAIpD,wBAAsB,aAAa,CAClC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,YAAY,EACnB,GAAG,EAAE,QAAQ,GACX,OAAO,CAAC,aAAa,CAAC,CA8BxB;AAED,8CAA8C;AAC9C,wBAAsB,iBAAiB,CACtC,UAAU,EAAE,SAAS,EAAE,EACvB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,YAAY,EACnB,GAAG,EAAE,QAAQ,GACX,OAAO,CAAC,aAAa,CAAC,CAoCxB;AAID,wBAAsB,eAAe,CACpC,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,YAAY,EACnB,GAAG,CAAC,EAAE,QAAQ,GACZ,OAAO,CAAC,aAAa,CAAC,CA4BxB"}
@@ -1,4 +1,4 @@
1
- import { runCommand as runSingleCommand } from "../commands";
1
+ import { runCommandDirect } from "../commands";
2
2
  import { resolvePath } from "../commands/helpers";
3
3
  // ── Script executor (handles &&/||/;) ────────────────────────────────────────
4
4
  export async function executeScript(script, authUser, hostname, mode, cwd, shell, env) {
@@ -10,7 +10,9 @@ export async function executeScript(script, authUser, hostname, mode, cwd, shell
10
10
  lastResult = await executePipeline(stmt.pipeline, authUser, hostname, mode, cwd, shell, env);
11
11
  env.lastExitCode = lastResult.exitCode ?? 0;
12
12
  // Propagate session-control signals
13
- if (lastResult.closeSession || lastResult.switchUser || lastResult.nextCwd) {
13
+ if (lastResult.closeSession ||
14
+ lastResult.switchUser ||
15
+ lastResult.nextCwd) {
14
16
  break;
15
17
  }
16
18
  }
@@ -68,22 +70,26 @@ async function executeSingleCommandWithRedirections(cmd, authUser, hostname, mod
68
70
  stdin = shell.vfs.readFile(inputPath);
69
71
  }
70
72
  catch {
71
- return { stderr: `${cmd.inputFile}: No such file or directory`, exitCode: 1 };
73
+ return {
74
+ stderr: `${cmd.inputFile}: No such file or directory`,
75
+ exitCode: 1,
76
+ };
72
77
  }
73
78
  }
74
- const rawInput = [cmd.name, ...cmd.args].join(" ");
75
- const result = await runSingleCommand(rawInput, authUser, hostname, mode, cwd, shell, stdin, env);
79
+ const result = await runCommandDirect(cmd.name, cmd.args, authUser, hostname, mode, cwd, shell, stdin, env);
76
80
  if (cmd.outputFile) {
77
81
  const outputPath = resolvePath(cwd, cmd.outputFile);
78
82
  const output = result.stdout || "";
79
83
  try {
80
84
  if (cmd.appendOutput) {
81
- const existing = (() => { try {
82
- return shell.vfs.readFile(outputPath);
83
- }
84
- catch {
85
- return "";
86
- } })();
85
+ const existing = (() => {
86
+ try {
87
+ return shell.vfs.readFile(outputPath);
88
+ }
89
+ catch {
90
+ return "";
91
+ }
92
+ })();
87
93
  shell.writeFileAsUser(authUser, outputPath, existing + output);
88
94
  }
89
95
  else {
@@ -92,7 +98,11 @@ async function executeSingleCommandWithRedirections(cmd, authUser, hostname, mod
92
98
  return { ...result, stdout: "" };
93
99
  }
94
100
  catch {
95
- return { ...result, stderr: `Failed to write to ${cmd.outputFile}`, exitCode: 1 };
101
+ return {
102
+ ...result,
103
+ stderr: `Failed to write to ${cmd.outputFile}`,
104
+ exitCode: 1,
105
+ };
96
106
  }
97
107
  }
98
108
  return result;
@@ -108,23 +118,27 @@ async function executePipelineChain(commands, authUser, hostname, mode, cwd, she
108
118
  currentOutput = shell.vfs.readFile(inputPath);
109
119
  }
110
120
  catch {
111
- return { stderr: `${cmd.inputFile}: No such file or directory`, exitCode: 1 };
121
+ return {
122
+ stderr: `${cmd.inputFile}: No such file or directory`,
123
+ exitCode: 1,
124
+ };
112
125
  }
113
126
  }
114
- const rawInput = [cmd.name, ...cmd.args].join(" ");
115
- const result = await runSingleCommand(rawInput, authUser, hostname, mode, cwd, shell, currentOutput, env);
127
+ const result = await runCommandDirect(cmd.name, cmd.args, authUser, hostname, mode, cwd, shell, currentOutput, env);
116
128
  exitCode = result.exitCode ?? 0;
117
129
  if (i === commands.length - 1 && cmd.outputFile) {
118
130
  const outputPath = resolvePath(cwd, cmd.outputFile);
119
131
  const output = result.stdout || "";
120
132
  try {
121
133
  if (cmd.appendOutput) {
122
- const existing = (() => { try {
123
- return shell.vfs.readFile(outputPath);
124
- }
125
- catch {
126
- return "";
127
- } })();
134
+ const existing = (() => {
135
+ try {
136
+ return shell.vfs.readFile(outputPath);
137
+ }
138
+ catch {
139
+ return "";
140
+ }
141
+ })();
128
142
  shell.writeFileAsUser(authUser, outputPath, existing + output);
129
143
  }
130
144
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/SSHMimic/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,MAAM,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AA0B/C,cAAM,QAAS,SAAQ,YAAY;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IACzB,OAAO,CAAC,KAAK,CAAe;IAE5B,mEAAmE;IACnE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,2DAA2D;IAC3D,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqC;IAElE;;;;;;;;OAQG;gBACS,EACX,IAAI,EACJ,QAA0B,EAC1B,KAAkC,EAClC,eAAmB,EACnB,iBAA0B,GAC1B,EAAE;QACF,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,YAAY,CAAC;QACrB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC3B;IAYD,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,aAAa;IAcrB;;;;OAIG;IACU,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IA0JrC;;OAEG;IACI,IAAI,IAAI,IAAI;IAUnB;;;OAGG;IACI,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;CAGrC;AAED,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/SSHMimic/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,MAAM,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AA0B/C,cAAM,QAAS,SAAQ,YAAY;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IACzB,OAAO,CAAC,KAAK,CAAe;IAE5B,mEAAmE;IACnE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,2DAA2D;IAC3D,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqC;IAElE;;;;;;;;OAQG;gBACS,EACX,IAAI,EACJ,QAA0B,EAC1B,KAAkC,EAClC,eAAmB,EACnB,iBAA0B,GAC1B,EAAE;QACF,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,YAAY,CAAC;QACrB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC3B;IAYD,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,aAAa;IAcrB;;;;OAIG;IACU,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IA6LrC;;OAEG;IACI,IAAI,IAAI,IAAI;IAUnB;;;OAGG;IACI,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;CAGrC;AAED,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,CAAC"}
@@ -103,7 +103,11 @@ class SshMimic extends EventEmitter {
103
103
  remoteAddress = ctx.ip ?? remoteAddress;
104
104
  // Rate-limit check
105
105
  if (this.isLockedOut(remoteAddress)) {
106
- this.emit("auth:failure", { username: candidateUser, remoteAddress, reason: "lockout" });
106
+ this.emit("auth:failure", {
107
+ username: candidateUser,
108
+ remoteAddress,
109
+ reason: "lockout",
110
+ });
107
111
  ctx.reject();
108
112
  return;
109
113
  }
@@ -123,7 +127,10 @@ class SshMimic extends EventEmitter {
123
127
  ctx.password === "" ||
124
128
  !shell.users.verifyPassword(candidateUser, ctx.password)) {
125
129
  this.recordFailure(remoteAddress);
126
- this.emit("auth:failure", { username: candidateUser, remoteAddress });
130
+ this.emit("auth:failure", {
131
+ username: candidateUser,
132
+ remoteAddress,
133
+ });
127
134
  ctx.reject();
128
135
  return;
129
136
  }
@@ -144,11 +151,14 @@ class SshMimic extends EventEmitter {
144
151
  return;
145
152
  }
146
153
  const incomingKey = ctx.key;
147
- const keyMatches = authorizedKeys.some((k) => k.algo === incomingKey.algo &&
148
- k.data.equals(incomingKey.data));
154
+ const keyMatches = authorizedKeys.some((k) => k.algo === incomingKey.algo && k.data.equals(incomingKey.data));
149
155
  if (!keyMatches) {
150
156
  this.recordFailure(remoteAddress);
151
- this.emit("auth:failure", { username: candidateUser, remoteAddress, method: "publickey" });
157
+ this.emit("auth:failure", {
158
+ username: candidateUser,
159
+ remoteAddress,
160
+ method: "publickey",
161
+ });
152
162
  ctx.reject();
153
163
  return;
154
164
  }
@@ -157,7 +167,11 @@ class SshMimic extends EventEmitter {
157
167
  authUser = candidateUser;
158
168
  sessionId = shell.users.registerSession(authUser, remoteAddress).id;
159
169
  this.recordSuccess(remoteAddress);
160
- this.emit("auth:success", { username: authUser, remoteAddress, method: "publickey" });
170
+ this.emit("auth:success", {
171
+ username: authUser,
172
+ remoteAddress,
173
+ method: "publickey",
174
+ });
161
175
  this.ensureHomeDir(authUser);
162
176
  ctx.accept();
163
177
  }
@@ -1 +1 @@
1
- {"version":3,"file":"binaryPack.d.ts","sourceRoot":"","sources":["../../src/VirtualFileSystem/binaryPack.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAkC,MAAM,iBAAiB,CAAC;AA2E7F;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM,CAM7D;AAuED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,qBAAqB,CAiB5D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAErD"}
1
+ {"version":3,"file":"binaryPack.d.ts","sourceRoot":"","sources":["../../src/VirtualFileSystem/binaryPack.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,EACX,qBAAqB,EAGrB,MAAM,iBAAiB,CAAC;AA+EzB;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM,CAM7D;AA0FD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,qBAAqB,CAiB5D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAErD"}
@@ -37,7 +37,9 @@ const TYPE_DIR = 0x02;
37
37
  // ── Encoder ───────────────────────────────────────────────────────────────────
38
38
  class Encoder {
39
39
  chunks = [];
40
- write(buf) { this.chunks.push(buf); }
40
+ write(buf) {
41
+ this.chunks.push(buf);
42
+ }
41
43
  writeUint8(n) {
42
44
  const b = Buffer.allocUnsafe(1);
43
45
  b.writeUInt8(n, 0);
@@ -67,7 +69,9 @@ class Encoder {
67
69
  this.writeUint32(bytes.length);
68
70
  this.chunks.push(bytes);
69
71
  }
70
- toBuffer() { return Buffer.concat(this.chunks); }
72
+ toBuffer() {
73
+ return Buffer.concat(this.chunks);
74
+ }
71
75
  }
72
76
  function encodeNode(enc, node) {
73
77
  if (node.type === "file") {
@@ -111,7 +115,9 @@ class Decoder {
111
115
  constructor(buf) {
112
116
  this.buf = buf;
113
117
  }
114
- readUint8() { return this.buf.readUInt8(this.pos++); }
118
+ readUint8() {
119
+ return this.buf.readUInt8(this.pos++);
120
+ }
115
121
  readUint16() {
116
122
  const v = this.buf.readUInt16LE(this.pos);
117
123
  this.pos += 2;
@@ -139,7 +145,9 @@ class Decoder {
139
145
  this.pos += len;
140
146
  return b;
141
147
  }
142
- remaining() { return this.buf.length - this.pos; }
148
+ remaining() {
149
+ return this.buf.length - this.pos;
150
+ }
143
151
  }
144
152
  function decodeNode(dec) {
145
153
  const type = dec.readUint8();
@@ -150,7 +158,15 @@ function decodeNode(dec) {
150
158
  if (type === TYPE_FILE) {
151
159
  const compressed = dec.readUint8() === 0x01;
152
160
  const content = dec.readBytes();
153
- return { type: "file", name, mode, createdAt, updatedAt, compressed, content };
161
+ return {
162
+ type: "file",
163
+ name,
164
+ mode,
165
+ createdAt,
166
+ updatedAt,
167
+ compressed,
168
+ content,
169
+ };
154
170
  }
155
171
  if (type === TYPE_DIR) {
156
172
  const count = dec.readUint32();
@@ -159,7 +175,14 @@ function decodeNode(dec) {
159
175
  const child = decodeNode(dec);
160
176
  children.set(child.name, child);
161
177
  }
162
- return { type: "directory", name, mode, createdAt, updatedAt, children };
178
+ return {
179
+ type: "directory",
180
+ name,
181
+ mode,
182
+ createdAt,
183
+ updatedAt,
184
+ children,
185
+ };
163
186
  }
164
187
  throw new Error(`[VFS binary] Unknown node type: 0x${type.toString(16)}`);
165
188
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/VirtualFileSystem/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/VirtualFileSystem/index.ts"],"names":[],"mappings":"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"}
@@ -244,15 +244,24 @@ class VirtualFileSystem extends EventEmitter {
244
244
  if (node.type === "file") {
245
245
  const f = node;
246
246
  return {
247
- type: "file", name, path: normalized, mode: f.mode,
248
- createdAt: f.createdAt, updatedAt: f.updatedAt,
249
- compressed: f.compressed, size: f.content.length,
247
+ type: "file",
248
+ name,
249
+ path: normalized,
250
+ mode: f.mode,
251
+ createdAt: f.createdAt,
252
+ updatedAt: f.updatedAt,
253
+ compressed: f.compressed,
254
+ size: f.content.length,
250
255
  };
251
256
  }
252
257
  const d = node;
253
258
  return {
254
- type: "directory", name, path: normalized, mode: d.mode,
255
- createdAt: d.createdAt, updatedAt: d.updatedAt,
259
+ type: "directory",
260
+ name,
261
+ path: normalized,
262
+ mode: d.mode,
263
+ createdAt: d.createdAt,
264
+ updatedAt: d.updatedAt,
256
265
  childrenCount: d.children.size,
257
266
  };
258
267
  }
@@ -287,7 +296,8 @@ class VirtualFileSystem extends EventEmitter {
287
296
  lines.push(`${connector}${name}`);
288
297
  if (child.type === "directory") {
289
298
  const sub = this.renderTreeLines(child, "")
290
- .split("\n").slice(1)
299
+ .split("\n")
300
+ .slice(1)
291
301
  .map((l) => `${nextPrefix}${l}`);
292
302
  lines.push(...sub);
293
303
  }
@@ -342,14 +352,19 @@ class VirtualFileSystem extends EventEmitter {
342
352
  : targetPath;
343
353
  const { parent, name } = getParentDirectory(this.root, normalizedLink, true, (p) => this.mkdirRecursive(p, 0o755));
344
354
  const symNode = {
345
- type: "file", name,
355
+ type: "file",
356
+ name,
346
357
  content: Buffer.from(normalizedTarget, "utf8"),
347
358
  mode: 0o120777,
348
359
  compressed: false,
349
- createdAt: new Date(), updatedAt: new Date(),
360
+ createdAt: new Date(),
361
+ updatedAt: new Date(),
350
362
  };
351
363
  parent.children.set(name, symNode);
352
- this.emit("symlink:create", { link: normalizedLink, target: normalizedTarget });
364
+ this.emit("symlink:create", {
365
+ link: normalizedLink,
366
+ target: normalizedTarget,
367
+ });
353
368
  }
354
369
  /** Returns true when the path is a symbolic link node. */
355
370
  isSymlink(targetPath) {
@@ -437,7 +452,9 @@ class VirtualFileSystem extends EventEmitter {
437
452
  : this.serializeDir(child));
438
453
  }
439
454
  return {
440
- type: "directory", name: dir.name, mode: dir.mode,
455
+ type: "directory",
456
+ name: dir.name,
457
+ mode: dir.mode,
441
458
  createdAt: dir.createdAt.toISOString(),
442
459
  updatedAt: dir.updatedAt.toISOString(),
443
460
  children,
@@ -445,7 +462,9 @@ class VirtualFileSystem extends EventEmitter {
445
462
  }
446
463
  serializeFile(file) {
447
464
  return {
448
- type: "file", name: file.name, mode: file.mode,
465
+ type: "file",
466
+ name: file.name,
467
+ mode: file.mode,
449
468
  createdAt: file.createdAt.toISOString(),
450
469
  updatedAt: file.updatedAt.toISOString(),
451
470
  compressed: file.compressed,
@@ -480,7 +499,9 @@ class VirtualFileSystem extends EventEmitter {
480
499
  }
481
500
  deserializeDir(snap, name) {
482
501
  const dir = {
483
- type: "directory", name, mode: snap.mode,
502
+ type: "directory",
503
+ name,
504
+ mode: snap.mode,
484
505
  createdAt: new Date(snap.createdAt),
485
506
  updatedAt: new Date(snap.updatedAt),
486
507
  children: new Map(),
@@ -489,7 +510,9 @@ class VirtualFileSystem extends EventEmitter {
489
510
  if (child.type === "file") {
490
511
  const f = child;
491
512
  dir.children.set(f.name, {
492
- type: "file", name: f.name, mode: f.mode,
513
+ type: "file",
514
+ name: f.name,
515
+ mode: f.mode,
493
516
  createdAt: new Date(f.createdAt),
494
517
  updatedAt: new Date(f.updatedAt),
495
518
  compressed: f.compressed,
@@ -0,0 +1,202 @@
1
+ import type VirtualFileSystem from "../VirtualFileSystem";
2
+ import type { VirtualUserManager } from "../VirtualUserManager";
3
+ /**
4
+ * A single file entry written into the VFS when a package is installed.
5
+ */
6
+ export interface PackageFile {
7
+ /** Absolute VFS destination path (e.g. `"/usr/bin/vim"`). */
8
+ path: string;
9
+ /** Text content to write. */
10
+ content: string;
11
+ /** POSIX mode bits (default `0o644`; use `0o755` for executables). */
12
+ mode?: number;
13
+ }
14
+ /**
15
+ * Metadata and behaviour definition for a single package in the registry.
16
+ *
17
+ * Used both for the built-in registry entries and for consumer-supplied custom
18
+ * packages. `files` are written to the VFS on `install()`, and `onInstall` /
19
+ * `onRemove` hooks allow arbitrary VFS mutations.
20
+ */
21
+ export interface PackageDefinition {
22
+ /** Package name — lowercase, no spaces (e.g. `"vim"`, `"build-essential"`). */
23
+ name: string;
24
+ /** Debian-style version string (e.g. `"2:9.0.1378-2"`). */
25
+ version: string;
26
+ /** CPU architecture label (default `"amd64"`). */
27
+ architecture?: string;
28
+ /** Maintainer name and email shown in `apt show` output. */
29
+ maintainer?: string;
30
+ /** Full package description. */
31
+ description: string;
32
+ /** Short one-line summary shown in `apt search` results. */
33
+ shortDesc?: string;
34
+ /** Installed disk usage in kilobytes (informational). */
35
+ installedSizeKb?: number;
36
+ /** Other package names that must be installed first (resolved recursively). */
37
+ depends?: string[];
38
+ /** Repository section (e.g. `"utils"`, `"net"`, `"editors"`, `"devel"`). */
39
+ section?: string;
40
+ /** Files to write into the VFS during installation. */
41
+ files?: PackageFile[];
42
+ /**
43
+ * Hook called after all files are written.
44
+ * Use to create directories, write config, or register shell commands.
45
+ */
46
+ onInstall?: (vfs: VirtualFileSystem, users: VirtualUserManager) => void;
47
+ /** Hook called before VFS files are removed during uninstall. */
48
+ onRemove?: (vfs: VirtualFileSystem) => void;
49
+ }
50
+ /**
51
+ * Runtime record of an installed package, persisted to `/var/lib/dpkg/status`.
52
+ */
53
+ export interface InstalledPackage {
54
+ /** Package name. */
55
+ name: string;
56
+ /** Installed version string. */
57
+ version: string;
58
+ /** CPU architecture. */
59
+ architecture: string;
60
+ /** Maintainer display string. */
61
+ maintainer: string;
62
+ /** Full description. */
63
+ description: string;
64
+ /** Repository section. */
65
+ section: string;
66
+ /** Installed disk usage in kilobytes. */
67
+ installedSizeKb: number;
68
+ /** ISO-8601 timestamp of when the package was installed. */
69
+ installedAt: string;
70
+ /** Absolute VFS paths written by this package (used by `dpkg -L`). */
71
+ files: string[];
72
+ }
73
+ /**
74
+ * Pure-TypeScript APT/dpkg package manager backed by a built-in registry.
75
+ *
76
+ * Accessed via `shell.packageManager` — not constructed directly.
77
+ *
78
+ * `install()` resolves dependencies recursively, writes declared files to the
79
+ * VFS, runs `onInstall` hooks, and persists state to `/var/lib/dpkg/status`.
80
+ * `remove()` reverses the process. All state survives VFS snapshot round-trips.
81
+ *
82
+ * @example
83
+ * ```ts
84
+ * const pm = shell.packageManager;
85
+ * pm.install(["vim", "git"]);
86
+ * console.log(pm.isInstalled("vim")); // true
87
+ * console.log(pm.installedCount()); // 2
88
+ * ```
89
+ */
90
+ export declare class VirtualPackageManager {
91
+ private readonly vfs;
92
+ private readonly users;
93
+ private readonly installed;
94
+ private readonly registryPath;
95
+ private readonly logPath;
96
+ private readonly aptLogPath;
97
+ /**
98
+ * @param vfs Backing virtual filesystem for file I/O and dpkg status persistence.
99
+ * @param users User manager reference passed to `onInstall` hooks.
100
+ */
101
+ constructor(vfs: VirtualFileSystem, users: VirtualUserManager);
102
+ /**
103
+ * Loads installed package state from `/var/lib/dpkg/status` in the VFS.
104
+ *
105
+ * Called automatically by `VirtualShell` after `bootstrapLinuxRootfs`.
106
+ * Safe to call again to reload state after a snapshot restore.
107
+ */
108
+ load(): void;
109
+ /** Persist installed state to /var/lib/dpkg/status. */
110
+ private persist;
111
+ private parseFields;
112
+ private log;
113
+ private aptLog;
114
+ /**
115
+ * Looks up a package definition in the built-in registry by name.
116
+ *
117
+ * @param name Package name (case-insensitive).
118
+ * @returns The matching `PackageDefinition`, or `undefined` if not found.
119
+ */
120
+ findInRegistry(name: string): PackageDefinition | undefined;
121
+ /**
122
+ * Returns all packages in the built-in registry, sorted alphabetically.
123
+ *
124
+ * @returns Array of `PackageDefinition` entries.
125
+ */
126
+ listAvailable(): PackageDefinition[];
127
+ /**
128
+ * Returns all currently installed packages, sorted alphabetically.
129
+ *
130
+ * @returns Array of `InstalledPackage` records.
131
+ */
132
+ listInstalled(): InstalledPackage[];
133
+ /**
134
+ * Returns `true` when the given package is currently installed.
135
+ *
136
+ * @param name Package name (case-insensitive).
137
+ */
138
+ isInstalled(name: string): boolean;
139
+ /**
140
+ * Returns the total number of installed packages.
141
+ *
142
+ * Used by `neofetch` to populate the `Packages:` field.
143
+ */
144
+ installedCount(): number;
145
+ /**
146
+ * Installs one or more packages from the registry.
147
+ *
148
+ * Dependencies listed in `PackageDefinition.depends` are resolved and
149
+ * installed automatically. Already-installed packages are skipped. Files
150
+ * declared in `PackageDefinition.files` are written to the VFS and
151
+ * `onInstall` hooks are called in dependency order.
152
+ *
153
+ * @param names Package names to install.
154
+ * @param opts Installation options.
155
+ * @param opts.quiet Suppress progress output lines when `true`.
156
+ * @returns Terminal-style `output` string and an APT-compatible `exitCode`
157
+ * (`0` on success, `100` when a package is not found).
158
+ */
159
+ install(names: string[], opts?: {
160
+ quiet?: boolean;
161
+ }): {
162
+ output: string;
163
+ exitCode: number;
164
+ };
165
+ /**
166
+ * Removes one or more installed packages.
167
+ *
168
+ * Package files are deleted from the VFS. Config files (paths under
169
+ * `/etc/` or ending in `.conf`) are preserved unless `opts.purge` is set.
170
+ * The `onRemove` hook is called for each package.
171
+ *
172
+ * @param names Package names to remove.
173
+ * @param opts Removal options.
174
+ * @param opts.purge Also delete configuration files when `true`.
175
+ * @param opts.quiet Suppress progress output lines when `true`.
176
+ * @returns Terminal-style `output` string and exit code (`0` on success).
177
+ */
178
+ remove(names: string[], opts?: {
179
+ purge?: boolean;
180
+ quiet?: boolean;
181
+ }): {
182
+ output: string;
183
+ exitCode: number;
184
+ };
185
+ /**
186
+ * Searches the registry for packages whose name or description contains
187
+ * the given term (case-insensitive). Equivalent to `apt-cache search`.
188
+ *
189
+ * @param term Search string.
190
+ * @returns Matching `PackageDefinition` entries sorted alphabetically.
191
+ */
192
+ search(term: string): PackageDefinition[];
193
+ /**
194
+ * Returns a dpkg-style metadata block for a package, including its
195
+ * install status. Equivalent to `apt-cache show` / `dpkg -s`.
196
+ *
197
+ * @param name Package name.
198
+ * @returns Multi-line metadata string, or `null` if not in the registry.
199
+ */
200
+ show(name: string): string | null;
201
+ }
202
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/VirtualPackageManager/index.ts"],"names":[],"mappings":"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"}