windows-development-sandbox 1.4.1 → 1.4.3

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 (872) hide show
  1. package/config.example.json +3 -1
  2. package/dist/api.js +27 -16
  3. package/dist/cli/args.d.ts +4 -6
  4. package/dist/cli/args.js +67 -34
  5. package/dist/cli/argv.d.ts +9 -0
  6. package/dist/cli/argv.js +22 -0
  7. package/dist/cli/commands/accounts.d.ts +1 -1
  8. package/dist/cli/commands/accounts.js +42 -27
  9. package/dist/cli/commands/agent-commands.d.ts +3 -3
  10. package/dist/cli/commands/agent-commands.js +27 -18
  11. package/dist/cli/commands/context.d.ts +9 -11
  12. package/dist/cli/commands/context.js +35 -32
  13. package/dist/cli/commands/data/clean.d.ts +2 -2
  14. package/dist/cli/commands/data/clean.js +27 -11
  15. package/dist/cli/commands/data/collect.d.ts +6 -3
  16. package/dist/cli/commands/data/collect.js +46 -15
  17. package/dist/cli/commands/data/index.d.ts +2 -2
  18. package/dist/cli/commands/data/index.js +30 -12
  19. package/dist/cli/commands/data/remove.d.ts +1 -1
  20. package/dist/cli/commands/data/remove.js +4 -4
  21. package/dist/cli/commands/index.d.ts +5 -4
  22. package/dist/cli/commands/index.js +5 -4
  23. package/dist/cli/commands/launch/add-root.d.ts +7 -0
  24. package/dist/cli/commands/launch/add-root.js +64 -0
  25. package/dist/cli/commands/launch/boot-progress.d.ts +7 -0
  26. package/dist/cli/commands/launch/boot-progress.js +48 -0
  27. package/dist/cli/commands/launch/boot-wants.d.ts +11 -0
  28. package/dist/cli/commands/launch/boot-wants.js +48 -0
  29. package/dist/cli/commands/launch/first-start.d.ts +10 -0
  30. package/dist/cli/commands/launch/first-start.js +53 -0
  31. package/dist/cli/commands/launch/index.d.ts +6 -0
  32. package/dist/cli/commands/launch/index.js +6 -0
  33. package/dist/cli/commands/launch/launch.d.ts +8 -0
  34. package/dist/cli/commands/launch/launch.js +211 -0
  35. package/dist/cli/commands/launch/prepare.d.ts +23 -0
  36. package/dist/cli/commands/launch/prepare.js +109 -0
  37. package/dist/cli/commands/launch/running.d.ts +45 -0
  38. package/dist/cli/commands/launch/running.js +218 -0
  39. package/dist/cli/commands/launch/summary.d.ts +8 -0
  40. package/dist/cli/commands/launch/summary.js +98 -0
  41. package/dist/cli/commands/maintenance/audit.d.ts +3 -0
  42. package/dist/cli/commands/maintenance/audit.js +58 -0
  43. package/dist/cli/commands/maintenance/clean.d.ts +2 -0
  44. package/dist/cli/commands/maintenance/clean.js +10 -0
  45. package/dist/cli/commands/maintenance/config.d.ts +2 -0
  46. package/dist/cli/commands/maintenance/config.js +145 -0
  47. package/dist/cli/commands/maintenance/doctor.d.ts +2 -0
  48. package/dist/cli/commands/maintenance/doctor.js +52 -0
  49. package/dist/cli/commands/maintenance/host-claude.d.ts +2 -0
  50. package/dist/cli/commands/maintenance/host-claude.js +4 -0
  51. package/dist/cli/commands/maintenance/index.d.ts +8 -0
  52. package/dist/cli/commands/maintenance/index.js +9 -0
  53. package/dist/cli/commands/maintenance/logs.d.ts +2 -0
  54. package/dist/cli/commands/maintenance/logs.js +44 -0
  55. package/dist/cli/commands/maintenance/sync.d.ts +2 -0
  56. package/dist/cli/commands/maintenance/sync.js +12 -0
  57. package/dist/cli/commands/maintenance/watch.d.ts +3 -0
  58. package/dist/cli/commands/maintenance/watch.js +6 -0
  59. package/dist/cli/commands/projects/describe-sessions.d.ts +3 -0
  60. package/dist/cli/commands/projects/describe-sessions.js +15 -0
  61. package/dist/cli/commands/projects/here.d.ts +38 -0
  62. package/dist/cli/commands/projects/here.js +145 -0
  63. package/dist/cli/commands/projects/index.d.ts +4 -0
  64. package/dist/cli/commands/projects/index.js +4 -0
  65. package/dist/cli/commands/projects/projects.d.ts +14 -0
  66. package/dist/cli/commands/projects/projects.js +213 -0
  67. package/dist/cli/commands/projects/restart.d.ts +15 -0
  68. package/dist/cli/commands/projects/restart.js +149 -0
  69. package/dist/cli/commands/registry.d.ts +3 -0
  70. package/dist/cli/commands/registry.js +34 -0
  71. package/dist/cli/commands/repair/checks.js +105 -29
  72. package/dist/cli/commands/repair/finders.d.ts +13 -10
  73. package/dist/cli/commands/repair/finders.js +63 -43
  74. package/dist/cli/commands/repair/index.d.ts +4 -4
  75. package/dist/cli/commands/repair/index.js +47 -21
  76. package/dist/cli/commands/repair/types.d.ts +2 -2
  77. package/dist/cli/commands/repair/types.js +7 -2
  78. package/dist/cli/commands/sessions/attach.d.ts +2 -0
  79. package/dist/cli/commands/sessions/attach.js +45 -0
  80. package/dist/cli/commands/sessions/control.d.ts +4 -0
  81. package/dist/cli/commands/sessions/control.js +62 -0
  82. package/dist/cli/commands/sessions/exec.d.ts +6 -0
  83. package/dist/cli/commands/sessions/exec.js +72 -0
  84. package/dist/cli/commands/sessions/index.d.ts +6 -0
  85. package/dist/cli/commands/sessions/index.js +9 -0
  86. package/dist/cli/commands/sessions/list.d.ts +15 -0
  87. package/dist/cli/commands/sessions/list.js +65 -0
  88. package/dist/cli/commands/sessions/status.d.ts +2 -0
  89. package/dist/cli/commands/sessions/status.js +153 -0
  90. package/dist/cli/commands/sessions/window.d.ts +3 -0
  91. package/dist/cli/commands/sessions/window.js +18 -0
  92. package/dist/cli/commands/setup/checks.d.ts +4 -4
  93. package/dist/cli/commands/setup/checks.js +36 -19
  94. package/dist/cli/commands/setup/facts.d.ts +6 -6
  95. package/dist/cli/commands/setup/facts.js +23 -11
  96. package/dist/cli/commands/setup/index.d.ts +1 -1
  97. package/dist/cli/commands/setup/index.js +25 -12
  98. package/dist/cli/commands/user-config.d.ts +5 -5
  99. package/dist/cli/commands/user-config.js +14 -12
  100. package/dist/cli/history.d.ts +5 -4
  101. package/dist/cli/history.js +23 -11
  102. package/dist/cli/index.d.ts +4 -14
  103. package/dist/cli/index.js +27 -77
  104. package/dist/cli/manifest.d.ts +464 -10
  105. package/dist/cli/manifest.js +327 -53
  106. package/dist/cli/menu/apps.d.ts +7 -5
  107. package/dist/cli/menu/apps.js +64 -16
  108. package/dist/cli/menu/command-fields.d.ts +15 -0
  109. package/dist/cli/menu/command-fields.js +23 -0
  110. package/dist/cli/menu/command-form.d.ts +3 -5
  111. package/dist/cli/menu/command-form.js +116 -48
  112. package/dist/cli/menu/home.d.ts +22 -0
  113. package/dist/cli/menu/home.js +72 -0
  114. package/dist/cli/menu/index.d.ts +2 -24
  115. package/dist/cli/menu/index.js +4 -178
  116. package/dist/cli/menu/menu.d.ts +23 -0
  117. package/dist/cli/menu/menu.js +185 -0
  118. package/dist/cli/menu/settings/categories.d.ts +2 -2
  119. package/dist/cli/menu/settings/categories.js +123 -20
  120. package/dist/cli/menu/settings/collections/collection-editor.d.ts +23 -0
  121. package/dist/cli/menu/settings/collections/collection-editor.js +89 -0
  122. package/dist/cli/menu/settings/collections/map-editor.d.ts +10 -0
  123. package/dist/cli/menu/settings/collections/map-editor.js +34 -0
  124. package/dist/cli/menu/settings/collections/object-list-editor.d.ts +10 -0
  125. package/dist/cli/menu/settings/collections/object-list-editor.js +23 -0
  126. package/dist/cli/menu/settings/collections/object-map-editor.d.ts +10 -0
  127. package/dist/cli/menu/settings/collections/object-map-editor.js +35 -0
  128. package/dist/cli/menu/settings/collections/string-list-editor.d.ts +12 -0
  129. package/dist/cli/menu/settings/collections/string-list-editor.js +39 -0
  130. package/dist/cli/menu/settings/config-file.d.ts +2 -2
  131. package/dist/cli/menu/settings/config-file.js +42 -19
  132. package/dist/cli/menu/settings/editor-actions.d.ts +2 -0
  133. package/dist/cli/menu/settings/editor-actions.js +2 -0
  134. package/dist/cli/menu/settings/format.d.ts +5 -0
  135. package/dist/cli/menu/settings/format.js +39 -0
  136. package/dist/cli/menu/settings/index.d.ts +1 -29
  137. package/dist/cli/menu/settings/index.js +1 -133
  138. package/dist/cli/menu/settings/object-editor.d.ts +12 -0
  139. package/dist/cli/menu/settings/object-editor.js +86 -0
  140. package/dist/cli/menu/settings/schema-node.d.ts +3 -1
  141. package/dist/cli/menu/settings/schema-node.js +71 -24
  142. package/dist/cli/menu/settings/settings-editor.d.ts +30 -0
  143. package/dist/cli/menu/settings/settings-editor.js +176 -0
  144. package/dist/cli/menu/settings/{editors.d.ts → value-editor.d.ts} +2 -13
  145. package/dist/cli/menu/settings/value-editor.js +137 -0
  146. package/dist/cli/menu/several.d.ts +4 -4
  147. package/dist/cli/menu/several.js +61 -20
  148. package/dist/cli/{colors.d.ts → output/colors.d.ts} +8 -8
  149. package/dist/cli/{colors.js → output/colors.js} +32 -14
  150. package/dist/cli/output/index.d.ts +3 -0
  151. package/dist/cli/output/index.js +3 -0
  152. package/dist/cli/output/print.d.ts +5 -0
  153. package/dist/cli/output/print.js +14 -0
  154. package/dist/cli/{progress.d.ts → output/progress.d.ts} +5 -5
  155. package/dist/cli/{progress.js → output/progress.js} +42 -19
  156. package/dist/cli/report.d.ts +2 -0
  157. package/dist/cli/report.js +20 -0
  158. package/dist/cli/tui/app.d.ts +6 -16
  159. package/dist/cli/tui/app.js +28 -8
  160. package/dist/cli/tui/dialogs/confirm-screen.d.ts +20 -0
  161. package/dist/cli/tui/dialogs/confirm-screen.js +50 -0
  162. package/dist/cli/tui/dialogs/message-screen.d.ts +17 -0
  163. package/dist/cli/tui/dialogs/message-screen.js +55 -0
  164. package/dist/cli/tui/dialogs/paragraphs.d.ts +2 -0
  165. package/dist/cli/tui/dialogs/paragraphs.js +5 -0
  166. package/dist/cli/tui/dialogs/text-screen.d.ts +26 -0
  167. package/dist/cli/tui/dialogs/text-screen.js +107 -0
  168. package/dist/cli/tui/frame.js +3 -1
  169. package/dist/cli/tui/index.d.ts +7 -3
  170. package/dist/cli/tui/index.js +4 -2
  171. package/dist/cli/tui/list/list-screen.d.ts +29 -0
  172. package/dist/cli/tui/{list-screen.js → list/list-screen.js} +86 -23
  173. package/dist/cli/tui/{list-screen.d.ts → list/list-types.d.ts} +0 -28
  174. package/dist/cli/tui/screen.d.ts +14 -0
  175. package/dist/cli/tui/terminal.js +34 -10
  176. package/dist/cli/tui/text.d.ts +2 -1
  177. package/dist/cli/tui/text.js +37 -7
  178. package/dist/cli/tui/theme.js +27 -9
  179. package/dist/cli/validate.d.ts +8 -8
  180. package/dist/cli/validate.js +32 -21
  181. package/dist/core/config/defaults.d.ts +2 -0
  182. package/dist/core/config/defaults.js +203 -0
  183. package/dist/core/config/index.d.ts +2 -0
  184. package/dist/core/config/index.js +3 -0
  185. package/dist/core/{config.d.ts → config/loader.d.ts} +1 -2
  186. package/dist/core/config/loader.js +47 -0
  187. package/dist/core/{detect-databases.js → detect/databases.js} +111 -23
  188. package/dist/core/detect/index.d.ts +4 -0
  189. package/dist/core/detect/index.js +4 -0
  190. package/dist/core/{detect-pwsh.d.ts → detect/pwsh.d.ts} +1 -1
  191. package/dist/core/{detect-pwsh.js → detect/pwsh.js} +25 -11
  192. package/dist/core/{detect-toolchains.d.ts → detect/toolchains.d.ts} +1 -1
  193. package/dist/core/{detect-toolchains.js → detect/toolchains.js} +42 -5
  194. package/dist/{guest/toolchains → core/detect}/versions.js +28 -12
  195. package/dist/core/disk.d.ts +2 -0
  196. package/dist/core/disk.js +46 -3
  197. package/dist/core/local-config/boot-wants.d.ts +45 -0
  198. package/dist/core/local-config/boot-wants.js +120 -0
  199. package/dist/core/local-config/file.d.ts +3 -0
  200. package/dist/core/local-config/file.js +16 -0
  201. package/dist/core/local-config/index.d.ts +5 -0
  202. package/dist/core/local-config/index.js +7 -0
  203. package/dist/core/{local-config.d.ts → local-config/overrides.d.ts} +3 -18
  204. package/dist/core/{local-config.js → local-config/overrides.js} +45 -52
  205. package/dist/core/local-config/policy.d.ts +19 -0
  206. package/dist/core/local-config/policy.js +45 -0
  207. package/dist/core/local-config/trust.d.ts +13 -0
  208. package/dist/core/local-config/trust.js +43 -0
  209. package/dist/core/package-info.d.ts +4 -0
  210. package/dist/core/package-info.js +13 -0
  211. package/dist/core/run/guest-workspace.d.ts +23 -0
  212. package/dist/core/run/guest-workspace.js +47 -0
  213. package/dist/core/run/index.d.ts +3 -0
  214. package/dist/core/run/index.js +3 -0
  215. package/dist/core/run/resolve-run.d.ts +3 -0
  216. package/dist/core/run/resolve-run.js +202 -0
  217. package/dist/core/run/versions.d.ts +13 -0
  218. package/dist/core/run/versions.js +65 -0
  219. package/dist/core/safe-paths.js +17 -5
  220. package/dist/core/schema/apps.d.ts +4 -4
  221. package/dist/core/schema/apps.js +55 -21
  222. package/dist/core/schema/common.d.ts +13 -10
  223. package/dist/core/schema/common.js +16 -10
  224. package/dist/core/schema/config.d.ts +15 -10
  225. package/dist/core/schema/config.js +78 -53
  226. package/dist/core/schema/databases.d.ts +4 -3
  227. package/dist/core/schema/databases.js +16 -12
  228. package/dist/core/schema/harness.d.ts +1 -1
  229. package/dist/core/schema/harness.js +17 -7
  230. package/dist/core/schema/index.d.ts +6 -0
  231. package/dist/core/schema/index.js +8 -0
  232. package/dist/core/schema/json-schema.js +10 -5
  233. package/dist/core/schema/profile.d.ts +4 -4
  234. package/dist/core/schema/profile.js +37 -17
  235. package/dist/core/schema/projects.d.ts +1 -1
  236. package/dist/core/schema/projects.js +16 -6
  237. package/dist/core/schema/sandbox.d.ts +11 -11
  238. package/dist/core/schema/sandbox.js +101 -37
  239. package/dist/core/schema/toolchains.d.ts +6 -1
  240. package/dist/core/schema/toolchains.js +84 -34
  241. package/dist/core/types.d.ts +19 -9
  242. package/dist/core/util/errors.d.ts +8 -0
  243. package/dist/core/util/errors.js +14 -0
  244. package/dist/core/util/fs.d.ts +8 -0
  245. package/dist/core/util/fs.js +40 -0
  246. package/dist/core/util/index.d.ts +7 -0
  247. package/dist/core/util/index.js +7 -0
  248. package/dist/core/util/jsonc.d.ts +6 -0
  249. package/dist/core/util/jsonc.js +25 -0
  250. package/dist/core/util/links.d.ts +10 -0
  251. package/dist/core/util/links.js +39 -0
  252. package/dist/core/util/paths.d.ts +7 -0
  253. package/dist/core/util/paths.js +33 -0
  254. package/dist/core/util/process.d.ts +15 -0
  255. package/dist/core/util/process.js +54 -0
  256. package/dist/core/util/text.d.ts +8 -0
  257. package/dist/core/util/text.js +8 -0
  258. package/dist/guest/{setup/agents.js → agents/agent-installer.js} +24 -4
  259. package/dist/guest/apps/after-install.d.ts +3 -0
  260. package/dist/guest/apps/after-install.js +47 -0
  261. package/dist/guest/apps/app-installer.d.ts +22 -0
  262. package/dist/guest/apps/app-installer.js +116 -0
  263. package/dist/guest/apps/find-exe.d.ts +5 -0
  264. package/dist/guest/apps/find-exe.js +41 -0
  265. package/dist/guest/apps/index.d.ts +3 -10
  266. package/dist/guest/apps/index.js +6 -206
  267. package/dist/guest/apps/resolvers.js +37 -9
  268. package/dist/guest/apps/shortcuts.d.ts +6 -0
  269. package/dist/guest/apps/shortcuts.js +28 -0
  270. package/dist/guest/apps/sources.d.ts +4 -0
  271. package/dist/guest/apps/sources.js +17 -0
  272. package/dist/guest/apps/unpack.d.ts +3 -0
  273. package/dist/guest/apps/unpack.js +47 -0
  274. package/dist/guest/{audit-parse.js → audit/parse.js} +39 -3
  275. package/dist/guest/{audit.d.ts → audit/process-audit.d.ts} +3 -1
  276. package/dist/guest/{audit.js → audit/process-audit.js} +33 -8
  277. package/dist/guest/boot/boot-env.d.ts +4 -0
  278. package/dist/guest/{boot-env.js → boot/boot-env.js} +7 -5
  279. package/dist/guest/boot/boot.d.ts +1 -0
  280. package/dist/guest/{main.js → boot/boot.js} +96 -50
  281. package/dist/guest/{guide.js → boot/guide.js} +32 -7
  282. package/dist/guest/{project-env.d.ts → boot/project-env.d.ts} +3 -3
  283. package/dist/guest/{project-env.js → boot/project-env.js} +12 -4
  284. package/dist/guest/boot/project-status.d.ts +5 -0
  285. package/dist/guest/boot/project-status.js +28 -0
  286. package/dist/guest/daemon/daemon.d.ts +1 -0
  287. package/dist/guest/daemon/daemon.js +51 -0
  288. package/dist/guest/daemon/exec.js +18 -6
  289. package/dist/guest/daemon/{shutdown.js → idle-shutdown.js} +5 -4
  290. package/dist/guest/daemon/{project.d.ts → project-provisioner.d.ts} +3 -3
  291. package/dist/guest/daemon/{project.js → project-provisioner.js} +60 -22
  292. package/dist/guest/daemon/relays.js +5 -3
  293. package/dist/guest/daemon/{session.js → sessions.js} +84 -24
  294. package/dist/guest/daemon/state.d.ts +4 -1
  295. package/dist/guest/daemon/state.js +34 -20
  296. package/dist/guest/databases/database-server.d.ts +13 -0
  297. package/dist/guest/databases/database-server.js +35 -0
  298. package/dist/guest/databases/dynamodb.d.ts +12 -0
  299. package/dist/guest/databases/dynamodb.js +81 -0
  300. package/dist/guest/databases/index.d.ts +2 -0
  301. package/dist/guest/databases/index.js +2 -0
  302. package/dist/guest/databases/mongodb.d.ts +7 -0
  303. package/dist/guest/databases/mongodb.js +46 -0
  304. package/dist/guest/databases/mysql.d.ts +7 -0
  305. package/dist/guest/databases/mysql.js +59 -0
  306. package/dist/guest/databases/names.d.ts +5 -0
  307. package/dist/guest/databases/names.js +8 -0
  308. package/dist/guest/databases/postgres.d.ts +9 -0
  309. package/dist/guest/databases/postgres.js +85 -0
  310. package/dist/guest/databases/redis.d.ts +7 -0
  311. package/dist/guest/databases/redis.js +25 -0
  312. package/dist/guest/databases/registry.d.ts +5 -0
  313. package/dist/guest/databases/registry.js +51 -0
  314. package/dist/guest/databases/sbx-db.d.ts +1 -0
  315. package/dist/guest/{db.js → databases/sbx-db.js} +13 -13
  316. package/dist/guest/{toolchains/databases → databases}/server.d.ts +5 -5
  317. package/dist/guest/{toolchains/databases → databases}/server.js +18 -13
  318. package/dist/guest/entries/daemon.js +16 -0
  319. package/dist/guest/entries/db.js +10 -0
  320. package/dist/guest/entries/gitguard.js +20 -0
  321. package/dist/guest/entries/main.d.ts +1 -0
  322. package/dist/guest/entries/main.js +24 -0
  323. package/dist/guest/entries/netproxy.d.ts +1 -0
  324. package/dist/guest/entries/netproxy.js +7 -0
  325. package/dist/guest/entries/view.d.ts +1 -0
  326. package/dist/guest/entries/view.js +11 -0
  327. package/dist/guest/{gitguard.js → git/decision.js} +49 -26
  328. package/dist/guest/network/addresses.d.ts +2 -0
  329. package/dist/guest/network/addresses.js +6 -0
  330. package/dist/guest/{setup/network.d.ts → network/allow-only.d.ts} +0 -10
  331. package/dist/guest/network/allow-only.js +84 -0
  332. package/dist/guest/network/firewall.d.ts +9 -0
  333. package/dist/guest/{setup/network.js → network/firewall.js} +58 -63
  334. package/dist/guest/network/proxy-server.d.ts +2 -0
  335. package/dist/guest/{netproxy.js → network/proxy-server.js} +37 -18
  336. package/dist/guest/{helpers.d.ts → runtime/csc.d.ts} +1 -1
  337. package/dist/guest/{helpers.js → runtime/csc.js} +7 -2
  338. package/dist/guest/runtime/fs.d.ts +2 -0
  339. package/dist/guest/runtime/fs.js +6 -0
  340. package/dist/guest/runtime/log.d.ts +3 -0
  341. package/dist/guest/runtime/log.js +22 -0
  342. package/dist/guest/runtime/paths.d.ts +13 -0
  343. package/dist/guest/runtime/paths.js +14 -0
  344. package/dist/guest/{ports.js → runtime/ports.js} +8 -2
  345. package/dist/guest/runtime/process.d.ts +15 -0
  346. package/dist/guest/runtime/process.js +59 -0
  347. package/dist/guest/{project-context.js → runtime/project-context.js} +1 -1
  348. package/dist/guest/runtime/session.d.ts +5 -0
  349. package/dist/guest/runtime/session.js +10 -0
  350. package/dist/guest/runtime/status.d.ts +7 -0
  351. package/dist/guest/runtime/status.js +57 -0
  352. package/dist/guest/{cmdline.js → sessions/cmdline.js} +10 -4
  353. package/dist/guest/{ptyhost.js → sessions/pty-host.js} +12 -5
  354. package/dist/guest/{view.js → sessions/viewer.js} +8 -11
  355. package/dist/guest/setup/claude-mem.d.ts +10 -0
  356. package/dist/guest/setup/{claude.js → claude-mem.js} +18 -78
  357. package/dist/guest/setup/{claude.d.ts → claude-profile.d.ts} +0 -10
  358. package/dist/guest/setup/claude-profile.js +89 -0
  359. package/dist/guest/setup/desktop.d.ts +2 -0
  360. package/dist/guest/setup/desktop.js +32 -0
  361. package/dist/guest/setup/environment.js +28 -5
  362. package/dist/guest/setup/{user.d.ts → git-identity.d.ts} +0 -2
  363. package/dist/guest/setup/git-identity.js +34 -0
  364. package/dist/guest/{gitrules.d.ts → setup/git-rules.d.ts} +1 -1
  365. package/dist/guest/setup/git-rules.js +50 -0
  366. package/dist/guest/setup/hooks.js +22 -5
  367. package/dist/guest/setup/{policy.js → managed-policy.js} +2 -2
  368. package/dist/guest/toolchains/catalogue.d.ts +4 -4
  369. package/dist/guest/toolchains/catalogue.js +30 -7
  370. package/dist/guest/toolchains/detect.d.ts +12 -0
  371. package/dist/guest/toolchains/detect.js +54 -0
  372. package/dist/guest/toolchains/index.d.ts +3 -17
  373. package/dist/guest/toolchains/index.js +1 -106
  374. package/dist/guest/toolchains/install.d.ts +20 -0
  375. package/dist/guest/toolchains/install.js +29 -0
  376. package/dist/guest/toolchains/languages/go.d.ts +3 -0
  377. package/dist/guest/toolchains/{go.js → languages/go.js} +27 -9
  378. package/dist/guest/toolchains/languages/java.d.ts +8 -0
  379. package/dist/guest/toolchains/{java.js → languages/java.js} +57 -18
  380. package/dist/guest/toolchains/languages/node.d.ts +3 -0
  381. package/dist/guest/toolchains/{node.js → languages/node.js} +51 -18
  382. package/dist/guest/toolchains/languages/php.d.ts +3 -0
  383. package/dist/guest/toolchains/{scripting → languages}/php.js +36 -11
  384. package/dist/guest/toolchains/languages/python-tools.d.ts +3 -0
  385. package/dist/guest/toolchains/languages/python-tools.js +12 -0
  386. package/dist/guest/toolchains/languages/python.d.ts +3 -0
  387. package/dist/guest/toolchains/{python.js → languages/python.js} +29 -16
  388. package/dist/guest/toolchains/languages/ruby.d.ts +3 -0
  389. package/dist/guest/toolchains/{scripting → languages}/ruby.js +28 -10
  390. package/dist/guest/toolchains/leftovers.d.ts +1 -1
  391. package/dist/guest/toolchains/leftovers.js +13 -11
  392. package/dist/guest/toolchains/managers.d.ts +6 -6
  393. package/dist/guest/toolchains/managers.js +38 -17
  394. package/dist/guest/toolchains/native/binstall.d.ts +3 -2
  395. package/dist/guest/toolchains/native/binstall.js +20 -8
  396. package/dist/guest/toolchains/native/cpp.d.ts +2 -2
  397. package/dist/guest/toolchains/native/cpp.js +23 -8
  398. package/dist/guest/toolchains/native/dotnet.d.ts +5 -3
  399. package/dist/guest/toolchains/native/dotnet.js +72 -24
  400. package/dist/guest/toolchains/native/mesa.d.ts +2 -2
  401. package/dist/guest/toolchains/native/mesa.js +27 -10
  402. package/dist/guest/toolchains/native/msvc/environment.d.ts +4 -4
  403. package/dist/guest/toolchains/native/msvc/environment.js +30 -16
  404. package/dist/guest/toolchains/native/msvc/index.d.ts +3 -3
  405. package/dist/guest/toolchains/native/msvc/index.js +10 -8
  406. package/dist/guest/toolchains/native/msvc/packages.d.ts +1 -1
  407. package/dist/guest/toolchains/native/msvc/packages.js +69 -23
  408. package/dist/guest/toolchains/native/msvc/tree.d.ts +6 -6
  409. package/dist/guest/toolchains/native/msvc/tree.js +15 -9
  410. package/dist/guest/toolchains/native/rust-extras.d.ts +23 -0
  411. package/dist/guest/toolchains/native/rust-extras.js +100 -0
  412. package/dist/guest/toolchains/native/rust.d.ts +2 -2
  413. package/dist/guest/toolchains/native/rust.js +41 -10
  414. package/dist/guest/toolchains/{scripting → native}/vcruntime.d.ts +2 -2
  415. package/dist/guest/toolchains/{scripting → native}/vcruntime.js +17 -7
  416. package/dist/guest/toolchains/package-ledger.d.ts +17 -0
  417. package/dist/guest/toolchains/package-ledger.js +54 -0
  418. package/dist/guest/toolchains/plan.d.ts +3 -24
  419. package/dist/guest/toolchains/plan.js +99 -111
  420. package/dist/guest/toolchains/runtimes.d.ts +6 -6
  421. package/dist/guest/toolchains/runtimes.js +31 -13
  422. package/dist/guest/toolchains/scheduler.d.ts +22 -0
  423. package/dist/guest/toolchains/scheduler.js +123 -0
  424. package/dist/guest/toolchains/setup.d.ts +10 -0
  425. package/dist/guest/toolchains/setup.js +22 -0
  426. package/dist/guest/toolchains/state-file.d.ts +3 -0
  427. package/dist/guest/toolchains/state-file.js +10 -0
  428. package/dist/guest/toolchains/step.d.ts +24 -0
  429. package/dist/guest/toolchains/step.js +1 -0
  430. package/dist/guest/toolchains/tool-env.d.ts +12 -0
  431. package/dist/guest/toolchains/tool-env.js +16 -0
  432. package/dist/guest/toolchains/tools/cli.d.ts +10 -0
  433. package/dist/guest/toolchains/{cli.js → tools/cli.js} +35 -15
  434. package/dist/guest/toolchains/tools/git.d.ts +3 -0
  435. package/dist/guest/toolchains/{git.js → tools/git.js} +38 -15
  436. package/dist/guest/toolchains/tools/pwsh.d.ts +4 -0
  437. package/dist/guest/toolchains/{pwsh.js → tools/pwsh.js} +14 -7
  438. package/dist/guest/toolchains/{vscode-profile.d.ts → tools/vscode-profile.d.ts} +6 -6
  439. package/dist/guest/toolchains/{vscode-profile.js → tools/vscode-profile.js} +28 -12
  440. package/dist/guest/toolchains/{vscode.d.ts → tools/vscode.d.ts} +6 -6
  441. package/dist/guest/toolchains/{vscode.js → tools/vscode.js} +67 -21
  442. package/dist/guest/toolchains/version-cache.d.ts +16 -0
  443. package/dist/guest/toolchains/version-cache.js +67 -0
  444. package/dist/host/agent-commands/commands.d.ts +13 -0
  445. package/dist/host/agent-commands/commands.js +33 -0
  446. package/dist/host/agent-commands/forwarders.d.ts +7 -0
  447. package/dist/host/agent-commands/forwarders.js +31 -0
  448. package/dist/host/agent-commands/index.d.ts +4 -0
  449. package/dist/host/agent-commands/index.js +4 -0
  450. package/dist/host/agent-commands/reconcile.d.ts +12 -0
  451. package/dist/host/agent-commands/reconcile.js +69 -0
  452. package/dist/host/agent-commands/user-path.d.ts +2 -0
  453. package/dist/host/agent-commands/user-path.js +33 -0
  454. package/dist/host/audit/collect.d.ts +2 -2
  455. package/dist/host/audit/collect.js +59 -22
  456. package/dist/host/audit/log.d.ts +2 -2
  457. package/dist/host/audit/log.js +24 -8
  458. package/dist/host/{attach.d.ts → channel/attach.d.ts} +2 -2
  459. package/dist/host/{attach.js → channel/attach.js} +33 -15
  460. package/dist/host/channel/channel.d.ts +51 -0
  461. package/dist/host/channel/channel.js +196 -0
  462. package/dist/host/channel/index.d.ts +2 -0
  463. package/dist/host/channel/index.js +2 -0
  464. package/dist/host/guard/agent-files.d.ts +7 -0
  465. package/dist/host/guard/agent-files.js +103 -0
  466. package/dist/host/guard/commands.d.ts +10 -0
  467. package/dist/host/guard/commands.js +123 -0
  468. package/dist/host/guard/file-hash.d.ts +4 -0
  469. package/dist/host/guard/file-hash.js +37 -0
  470. package/dist/host/guard/git-config.d.ts +5 -0
  471. package/dist/host/guard/git-config.js +62 -0
  472. package/dist/host/guard/git-dirs.d.ts +12 -0
  473. package/dist/host/guard/git-dirs.js +53 -0
  474. package/dist/host/guard/index.d.ts +5 -0
  475. package/dist/host/guard/index.js +4 -0
  476. package/dist/host/guard/mark-of-the-web.d.ts +8 -0
  477. package/dist/host/guard/mark-of-the-web.js +74 -0
  478. package/dist/host/guard/nested-repos.d.ts +14 -0
  479. package/dist/host/guard/nested-repos.js +88 -0
  480. package/dist/host/guard/quarantine.d.ts +3 -0
  481. package/dist/host/guard/quarantine.js +24 -0
  482. package/dist/host/guard/repo-guard.d.ts +10 -0
  483. package/dist/host/guard/repo-guard.js +36 -0
  484. package/dist/host/guard/store.d.ts +40 -0
  485. package/dist/host/guard/store.js +145 -0
  486. package/dist/host/guard/types.d.ts +27 -0
  487. package/dist/host/guard/types.js +3 -0
  488. package/dist/host/guard/watch-state.d.ts +9 -0
  489. package/dist/host/guard/watch-state.js +26 -0
  490. package/dist/host/launch/boot-projects.d.ts +17 -0
  491. package/dist/host/launch/{projects.js → boot-projects.js} +22 -13
  492. package/dist/host/{database-plan.d.ts → launch/database-plan.d.ts} +5 -5
  493. package/dist/host/{database-plan.js → launch/database-plan.js} +24 -13
  494. package/dist/host/launch/generate.d.ts +4 -0
  495. package/dist/host/launch/generate.js +77 -0
  496. package/dist/host/launch/index.d.ts +10 -0
  497. package/dist/host/launch/index.js +10 -0
  498. package/dist/host/launch/mappings.d.ts +5 -5
  499. package/dist/host/launch/mappings.js +37 -24
  500. package/dist/host/launch/pc-scan.d.ts +5 -0
  501. package/dist/host/{pc-scan.js → launch/pc-scan.js} +20 -13
  502. package/dist/host/launch/project-scan.d.ts +7 -0
  503. package/dist/host/{project-scan.js → launch/project-scan.js} +29 -21
  504. package/dist/host/launch/session-file.d.ts +23 -0
  505. package/dist/host/launch/session-file.js +73 -0
  506. package/dist/host/launch/stage.d.ts +5 -5
  507. package/dist/host/launch/stage.js +14 -13
  508. package/dist/host/launch/toolchains.d.ts +4 -0
  509. package/dist/host/launch/toolchains.js +11 -0
  510. package/dist/host/launch/{wsb.d.ts → wsb-file.d.ts} +4 -2
  511. package/dist/host/launch/wsb-file.js +56 -0
  512. package/dist/host/life/crash-report.d.ts +8 -0
  513. package/dist/host/life/crash-report.js +87 -0
  514. package/dist/host/life/index.d.ts +6 -0
  515. package/dist/host/life/index.js +6 -0
  516. package/dist/host/life/keep-awake.d.ts +10 -0
  517. package/dist/host/life/keep-awake.js +29 -0
  518. package/dist/host/life/life-record.d.ts +48 -0
  519. package/dist/host/life/life-record.js +76 -0
  520. package/dist/host/life/stop-events.d.ts +27 -0
  521. package/dist/host/life/stop-events.js +96 -0
  522. package/dist/host/life/stop-warning.d.ts +4 -0
  523. package/dist/host/life/stop-warning.js +25 -0
  524. package/dist/host/life/windows-update.d.ts +3 -0
  525. package/dist/host/life/windows-update.js +11 -0
  526. package/dist/host/native.d.ts +4 -0
  527. package/dist/host/native.js +11 -0
  528. package/dist/host/network/index.d.ts +1 -0
  529. package/dist/host/network/index.js +1 -0
  530. package/dist/host/{port-forward.d.ts → network/port-forward.d.ts} +1 -1
  531. package/dist/host/{port-forward.js → network/port-forward.js} +16 -10
  532. package/dist/host/profile/accounts.d.ts +37 -0
  533. package/dist/host/profile/accounts.js +146 -0
  534. package/dist/host/profile/claude-login.d.ts +22 -0
  535. package/dist/host/profile/claude-login.js +57 -0
  536. package/dist/host/{claude-profile.d.ts → profile/claude-profile.d.ts} +9 -9
  537. package/dist/host/{claude-profile.js → profile/claude-profile.js} +32 -22
  538. package/dist/host/profile/index.d.ts +7 -0
  539. package/dist/host/profile/index.js +7 -0
  540. package/dist/host/profile/personalize.d.ts +2 -0
  541. package/dist/host/profile/personalize.js +127 -0
  542. package/dist/host/profile/reg-file.d.ts +8 -0
  543. package/dist/host/profile/reg-file.js +45 -0
  544. package/dist/host/profile/secret-files.d.ts +2 -0
  545. package/dist/host/profile/secret-files.js +25 -0
  546. package/dist/host/profile/secret-patterns.d.ts +6 -0
  547. package/dist/host/profile/secret-patterns.js +128 -0
  548. package/dist/host/profile/secrets.d.ts +12 -0
  549. package/dist/host/profile/secrets.js +100 -0
  550. package/dist/host/projects/index.d.ts +4 -0
  551. package/dist/host/projects/index.js +4 -0
  552. package/dist/host/{join.d.ts → projects/join.d.ts} +12 -9
  553. package/dist/host/{join.js → projects/join.js} +62 -33
  554. package/dist/host/projects/known.d.ts +28 -0
  555. package/dist/host/projects/known.js +55 -0
  556. package/dist/host/projects/mapper.d.ts +29 -0
  557. package/dist/host/projects/mapper.js +88 -0
  558. package/dist/host/projects/registry.d.ts +83 -0
  559. package/dist/host/projects/registry.js +136 -0
  560. package/dist/host/sandbox/doctor.d.ts +2 -0
  561. package/dist/host/sandbox/doctor.js +42 -0
  562. package/dist/host/sandbox/host-claude.d.ts +1 -0
  563. package/dist/host/sandbox/host-claude.js +26 -0
  564. package/dist/host/sandbox/index.d.ts +6 -0
  565. package/dist/host/sandbox/index.js +6 -0
  566. package/dist/host/{platform.d.ts → sandbox/platform.d.ts} +0 -5
  567. package/dist/host/sandbox/platform.js +60 -0
  568. package/dist/host/sandbox/probe.d.ts +3 -0
  569. package/dist/host/sandbox/probe.js +47 -0
  570. package/dist/host/{window.js → sandbox/window.js} +7 -5
  571. package/dist/host/{wsb.js → sandbox/wsb-cli.js} +31 -8
  572. package/dist/host/{cleanup.js → storage/cleanup.js} +27 -12
  573. package/dist/host/storage/index.d.ts +2 -0
  574. package/dist/host/storage/index.js +2 -0
  575. package/dist/host/storage/state-files.d.ts +4 -0
  576. package/dist/host/storage/state-files.js +10 -0
  577. package/dist/host/test-guard.js +1 -1
  578. package/dist/host/tools/conpty.d.ts +8 -0
  579. package/dist/host/tools/conpty.js +58 -0
  580. package/dist/host/tools/index.d.ts +2 -0
  581. package/dist/host/tools/index.js +2 -0
  582. package/dist/host/{terminal.d.ts → tools/windows-terminal.d.ts} +2 -10
  583. package/dist/host/{terminal.js → tools/windows-terminal.js} +33 -57
  584. package/dist/host/workspace-view/active-views.d.ts +3 -0
  585. package/dist/host/workspace-view/active-views.js +22 -0
  586. package/dist/host/workspace-view/index.d.ts +2 -18
  587. package/dist/host/workspace-view/index.js +2 -49
  588. package/dist/host/workspace-view/plan.d.ts +16 -0
  589. package/dist/host/workspace-view/plan.js +50 -0
  590. package/dist/host/workspace-view/rules.js +10 -3
  591. package/dist/host/workspace-view/view-state.d.ts +10 -0
  592. package/dist/host/workspace-view/view-state.js +31 -0
  593. package/dist/host/workspace-view/view.d.ts +1 -0
  594. package/dist/host/workspace-view/view.js +51 -55
  595. package/dist/runtime/daemon.js +4220 -1968
  596. package/dist/runtime/db.js +2134 -849
  597. package/dist/runtime/gitguard.js +29 -11
  598. package/dist/runtime/main.js +4687 -2243
  599. package/dist/runtime/netproxy.js +1644 -420
  600. package/dist/runtime/view.js +1356 -428
  601. package/dist/selftest/accounts.test.d.ts +1 -1
  602. package/dist/selftest/accounts.test.js +20 -17
  603. package/dist/selftest/agent-commands.test.d.ts +1 -1
  604. package/dist/selftest/agent-commands.test.js +9 -5
  605. package/dist/selftest/audit.test.d.ts +1 -1
  606. package/dist/selftest/audit.test.js +46 -13
  607. package/dist/selftest/channel.test.d.ts +1 -1
  608. package/dist/selftest/channel.test.js +63 -16
  609. package/dist/selftest/cli.test.d.ts +1 -1
  610. package/dist/selftest/cli.test.js +68 -16
  611. package/dist/selftest/cmdline.test.d.ts +1 -1
  612. package/dist/selftest/cmdline.test.js +36 -7
  613. package/dist/selftest/config.test.d.ts +1 -1
  614. package/dist/selftest/config.test.js +12 -5
  615. package/dist/selftest/data.test.d.ts +1 -1
  616. package/dist/selftest/data.test.js +35 -6
  617. package/dist/selftest/detect.test.d.ts +1 -1
  618. package/dist/selftest/detect.test.js +22 -9
  619. package/dist/selftest/generate.test.d.ts +1 -1
  620. package/dist/selftest/generate.test.js +33 -9
  621. package/dist/selftest/git-access.test.d.ts +1 -1
  622. package/dist/selftest/git-access.test.js +42 -4
  623. package/dist/selftest/guest-boot.test.d.ts +1 -1
  624. package/dist/selftest/guest-boot.test.js +25 -7
  625. package/dist/selftest/host-sim.test.d.ts +1 -1
  626. package/dist/selftest/host-sim.test.js +27 -3
  627. package/dist/selftest/hostile-input.test.d.ts +1 -1
  628. package/dist/selftest/hostile-input.test.js +5 -5
  629. package/dist/selftest/index.d.ts +1 -1
  630. package/dist/selftest/index.js +72 -16
  631. package/dist/selftest/layout.test.d.ts +2 -0
  632. package/dist/selftest/layout.test.js +131 -0
  633. package/dist/selftest/links.test.d.ts +1 -1
  634. package/dist/selftest/links.test.js +16 -11
  635. package/dist/selftest/live-daemon.test.d.ts +1 -1
  636. package/dist/selftest/live-daemon.test.js +20 -8
  637. package/dist/selftest/live-git.test.d.ts +1 -1
  638. package/dist/selftest/live-git.test.js +13 -4
  639. package/dist/selftest/live-network.test.d.ts +1 -1
  640. package/dist/selftest/live-network.test.js +24 -9
  641. package/dist/selftest/live-projects.test.d.ts +1 -1
  642. package/dist/selftest/live-projects.test.js +47 -20
  643. package/dist/selftest/live-terminal.test.d.ts +1 -1
  644. package/dist/selftest/live-terminal.test.js +41 -15
  645. package/dist/selftest/local-config.test.d.ts +1 -1
  646. package/dist/selftest/local-config.test.js +64 -16
  647. package/dist/selftest/mirror.test.d.ts +1 -1
  648. package/dist/selftest/mirror.test.js +102 -32
  649. package/dist/selftest/network.test.d.ts +1 -1
  650. package/dist/selftest/network.test.js +17 -8
  651. package/dist/selftest/personalization.test.d.ts +1 -1
  652. package/dist/selftest/personalization.test.js +12 -5
  653. package/dist/selftest/projects.test.d.ts +1 -1
  654. package/dist/selftest/projects.test.js +280 -85
  655. package/dist/selftest/repair.test.d.ts +1 -1
  656. package/dist/selftest/repair.test.js +17 -5
  657. package/dist/selftest/repo-guard.test.d.ts +1 -1
  658. package/dist/selftest/repo-guard.test.js +21 -20
  659. package/dist/selftest/secrets.test.d.ts +1 -1
  660. package/dist/selftest/secrets.test.js +57 -13
  661. package/dist/selftest/setup.test.d.ts +1 -1
  662. package/dist/selftest/setup.test.js +25 -5
  663. package/dist/selftest/{fixtures.d.ts → support/fixtures.d.ts} +5 -3
  664. package/dist/selftest/{fixtures.js → support/fixtures.js} +95 -17
  665. package/dist/selftest/{harness.js → support/harness.js} +24 -7
  666. package/dist/selftest/{live.d.ts → support/live.d.ts} +2 -2
  667. package/dist/selftest/{live.js → support/live.js} +34 -10
  668. package/dist/selftest/support/suite.js +1 -0
  669. package/dist/selftest/sync.test.d.ts +1 -1
  670. package/dist/selftest/sync.test.js +64 -26
  671. package/dist/selftest/test-guard.test.d.ts +1 -1
  672. package/dist/selftest/test-guard.test.js +43 -15
  673. package/dist/selftest/toolchains.test.d.ts +1 -1
  674. package/dist/selftest/toolchains.test.js +135 -36
  675. package/dist/selftest/workspace-view.test.d.ts +1 -1
  676. package/dist/selftest/workspace-view.test.js +48 -11
  677. package/dist/selftest/workspace.test.d.ts +1 -1
  678. package/dist/selftest/workspace.test.js +13 -4
  679. package/dist/shared/{apps.d.ts → apps/catalogue.d.ts} +1 -11
  680. package/dist/shared/apps/catalogue.js +768 -0
  681. package/dist/shared/apps/index.d.ts +2 -0
  682. package/dist/shared/apps/index.js +2 -0
  683. package/dist/shared/apps/selection.d.ts +11 -0
  684. package/dist/shared/apps/selection.js +40 -0
  685. package/dist/shared/channel/index.d.ts +2 -0
  686. package/dist/shared/channel/index.js +2 -0
  687. package/dist/shared/channel/run-dir.d.ts +30 -0
  688. package/dist/shared/channel/run-dir.js +84 -0
  689. package/dist/shared/{schema.d.ts → channel/schema.d.ts} +38 -21
  690. package/dist/shared/{schema.js → channel/schema.js} +62 -35
  691. package/dist/shared/download/archive.d.ts +13 -0
  692. package/dist/shared/download/archive.js +57 -0
  693. package/dist/shared/download/downloader.d.ts +35 -0
  694. package/dist/shared/download/downloader.js +110 -0
  695. package/dist/shared/download/github.d.ts +16 -0
  696. package/dist/shared/download/github.js +74 -0
  697. package/dist/shared/download/http.d.ts +5 -0
  698. package/dist/shared/download/http.js +30 -0
  699. package/dist/shared/download/index.d.ts +5 -0
  700. package/dist/shared/download/index.js +5 -0
  701. package/dist/shared/download/spawn.d.ts +2 -0
  702. package/dist/shared/download/spawn.js +7 -0
  703. package/dist/shared/io/index.d.ts +3 -0
  704. package/dist/shared/io/index.js +3 -0
  705. package/dist/shared/io/json-file.d.ts +10 -0
  706. package/dist/shared/io/json-file.js +21 -0
  707. package/dist/shared/io/json.d.ts +13 -0
  708. package/dist/shared/io/json.js +49 -0
  709. package/dist/shared/{safe-remove.js → io/safe-remove.js} +32 -7
  710. package/dist/shared/{netrules.js → network/firewall-rules.js} +36 -5
  711. package/dist/shared/network/index.d.ts +2 -0
  712. package/dist/shared/network/index.js +2 -0
  713. package/dist/shared/{netpolicy.js → network/policy.js} +66 -11
  714. package/dist/shared/{paths.js → paths/claude-paths.js} +12 -2
  715. package/dist/shared/{guest-paths.d.ts → paths/guest-paths.d.ts} +6 -12
  716. package/dist/shared/{guest-paths.js → paths/guest-paths.js} +53 -36
  717. package/dist/shared/paths/index.d.ts +3 -0
  718. package/dist/shared/paths/index.js +3 -0
  719. package/dist/shared/{projects.js → paths/projects.js} +13 -3
  720. package/dist/shared/pty/client.d.ts +21 -0
  721. package/dist/shared/pty/client.js +79 -0
  722. package/dist/shared/{console-input.js → pty/console-input.js} +26 -6
  723. package/dist/shared/pty/index.d.ts +6 -0
  724. package/dist/shared/pty/index.js +6 -0
  725. package/dist/shared/pty/input-joiner.d.ts +15 -0
  726. package/dist/shared/pty/input-joiner.js +44 -0
  727. package/dist/shared/pty/output-filter.d.ts +13 -0
  728. package/dist/shared/pty/output-filter.js +140 -0
  729. package/dist/shared/pty/protocol.d.ts +36 -0
  730. package/dist/shared/pty/protocol.js +60 -0
  731. package/dist/shared/pty/terminal.d.ts +24 -0
  732. package/dist/shared/pty/terminal.js +147 -0
  733. package/dist/shared/test-guard.js +3 -1
  734. package/dist/sync/claude-mem.d.ts +1 -1
  735. package/dist/sync/claude-mem.js +9 -4
  736. package/dist/sync/history.d.ts +1 -29
  737. package/dist/sync/history.js +57 -45
  738. package/dist/sync/index.d.ts +5 -0
  739. package/dist/sync/index.js +5 -0
  740. package/dist/sync/sync-cycle.d.ts +18 -0
  741. package/dist/sync/sync-cycle.js +85 -0
  742. package/dist/sync/sync-state.d.ts +32 -0
  743. package/dist/sync/sync-state.js +37 -0
  744. package/dist/sync/watcher.d.ts +0 -18
  745. package/dist/sync/watcher.js +66 -100
  746. package/native/keep-awake.ps1 +8 -0
  747. package/native/power.cs +23 -0
  748. package/native/stop-events.ps1 +38 -0
  749. package/package.json +11 -3
  750. package/sandbox/linkgate.cs +98 -0
  751. package/sandbox/memlog.ps1 +15 -6
  752. package/schemas/config.schema.json +34 -1
  753. package/schemas/sandbox-config.schema.json +34 -1
  754. package/dist/cli/boot-progress.d.ts +0 -22
  755. package/dist/cli/boot-progress.js +0 -59
  756. package/dist/cli/commands/launch.d.ts +0 -32
  757. package/dist/cli/commands/launch.js +0 -421
  758. package/dist/cli/commands/maintenance.d.ts +0 -10
  759. package/dist/cli/commands/maintenance.js +0 -220
  760. package/dist/cli/commands/project.d.ts +0 -33
  761. package/dist/cli/commands/project.js +0 -102
  762. package/dist/cli/commands/projects.d.ts +0 -14
  763. package/dist/cli/commands/projects.js +0 -146
  764. package/dist/cli/commands/restart.d.ts +0 -6
  765. package/dist/cli/commands/restart.js +0 -95
  766. package/dist/cli/commands/sessions.d.ts +0 -12
  767. package/dist/cli/commands/sessions.js +0 -258
  768. package/dist/cli/menu/settings/editors.js +0 -305
  769. package/dist/cli/tui/dialogs.d.ts +0 -57
  770. package/dist/cli/tui/dialogs.js +0 -162
  771. package/dist/core/config.js +0 -109
  772. package/dist/core/project-policy.d.ts +0 -62
  773. package/dist/core/project-policy.js +0 -121
  774. package/dist/core/schema.d.ts +0 -6
  775. package/dist/core/schema.js +0 -8
  776. package/dist/core/util.d.ts +0 -62
  777. package/dist/core/util.js +0 -156
  778. package/dist/core/workspace.d.ts +0 -35
  779. package/dist/core/workspace.js +0 -206
  780. package/dist/guest/boot-env.d.ts +0 -4
  781. package/dist/guest/daemon.js +0 -57
  782. package/dist/guest/env.d.ts +0 -56
  783. package/dist/guest/env.js +0 -115
  784. package/dist/guest/gitrules.js +0 -11
  785. package/dist/guest/project-status.d.ts +0 -5
  786. package/dist/guest/project-status.js +0 -17
  787. package/dist/guest/setup/user.js +0 -51
  788. package/dist/guest/toolchains/cli.d.ts +0 -10
  789. package/dist/guest/toolchains/common.d.ts +0 -54
  790. package/dist/guest/toolchains/common.js +0 -147
  791. package/dist/guest/toolchains/databases/dynamodb.d.ts +0 -8
  792. package/dist/guest/toolchains/databases/dynamodb.js +0 -52
  793. package/dist/guest/toolchains/databases/index.d.ts +0 -6
  794. package/dist/guest/toolchains/databases/index.js +0 -62
  795. package/dist/guest/toolchains/databases/mongodb.d.ts +0 -3
  796. package/dist/guest/toolchains/databases/mongodb.js +0 -31
  797. package/dist/guest/toolchains/databases/mysql.d.ts +0 -3
  798. package/dist/guest/toolchains/databases/mysql.js +0 -38
  799. package/dist/guest/toolchains/databases/postgres.d.ts +0 -5
  800. package/dist/guest/toolchains/databases/postgres.js +0 -38
  801. package/dist/guest/toolchains/databases/redis.d.ts +0 -3
  802. package/dist/guest/toolchains/databases/redis.js +0 -16
  803. package/dist/guest/toolchains/git.d.ts +0 -3
  804. package/dist/guest/toolchains/go.d.ts +0 -3
  805. package/dist/guest/toolchains/java.d.ts +0 -8
  806. package/dist/guest/toolchains/node.d.ts +0 -3
  807. package/dist/guest/toolchains/pwsh.d.ts +0 -4
  808. package/dist/guest/toolchains/python.d.ts +0 -3
  809. package/dist/guest/toolchains/scripting/php.d.ts +0 -3
  810. package/dist/guest/toolchains/scripting/ruby.d.ts +0 -3
  811. package/dist/host/accounts.d.ts +0 -32
  812. package/dist/host/accounts.js +0 -128
  813. package/dist/host/agent-commands.d.ts +0 -25
  814. package/dist/host/agent-commands.js +0 -145
  815. package/dist/host/channel.d.ts +0 -38
  816. package/dist/host/channel.js +0 -163
  817. package/dist/host/generate.d.ts +0 -13
  818. package/dist/host/generate.js +0 -115
  819. package/dist/host/launch/projects.d.ts +0 -17
  820. package/dist/host/launch/wsb.js +0 -34
  821. package/dist/host/motw.d.ts +0 -17
  822. package/dist/host/motw.js +0 -74
  823. package/dist/host/pc-scan.d.ts +0 -6
  824. package/dist/host/personalize.d.ts +0 -10
  825. package/dist/host/personalize.js +0 -97
  826. package/dist/host/platform.js +0 -129
  827. package/dist/host/project-scan.d.ts +0 -7
  828. package/dist/host/projects.d.ts +0 -123
  829. package/dist/host/projects.js +0 -196
  830. package/dist/host/repo-guard.d.ts +0 -43
  831. package/dist/host/repo-guard.js +0 -347
  832. package/dist/host/secrets.d.ts +0 -14
  833. package/dist/host/secrets.js +0 -133
  834. package/dist/host/stops.d.ts +0 -67
  835. package/dist/host/stops.js +0 -126
  836. package/dist/shared/apps.js +0 -114
  837. package/dist/shared/download.d.ts +0 -63
  838. package/dist/shared/download.js +0 -238
  839. package/dist/shared/pty-client.d.ts +0 -108
  840. package/dist/shared/pty-client.js +0 -406
  841. package/dist/shared/rundir.d.ts +0 -41
  842. package/dist/shared/rundir.js +0 -96
  843. /package/dist/{guest/daemon.d.ts → cli/tui/list/list-types.js} +0 -0
  844. /package/dist/{guest/db.d.ts → cli/tui/screen.js} +0 -0
  845. /package/dist/core/{detect-databases.d.ts → detect/databases.d.ts} +0 -0
  846. /package/dist/{guest/toolchains → core/detect}/versions.d.ts +0 -0
  847. /package/dist/guest/{setup/agents.d.ts → agents/agent-installer.d.ts} +0 -0
  848. /package/dist/guest/{audit-parse.d.ts → audit/parse.d.ts} +0 -0
  849. /package/dist/guest/{guide.d.ts → boot/guide.d.ts} +0 -0
  850. /package/dist/guest/daemon/{shutdown.d.ts → idle-shutdown.d.ts} +0 -0
  851. /package/dist/guest/daemon/{session.d.ts → sessions.d.ts} +0 -0
  852. /package/dist/guest/{main.d.ts → entries/daemon.d.ts} +0 -0
  853. /package/dist/guest/{netproxy.d.ts → entries/db.d.ts} +0 -0
  854. /package/dist/{selftest/suite.js → guest/entries/gitguard.d.ts} +0 -0
  855. /package/dist/guest/{gitguard.d.ts → git/decision.d.ts} +0 -0
  856. /package/dist/guest/{ports.d.ts → runtime/ports.d.ts} +0 -0
  857. /package/dist/guest/{project-context.d.ts → runtime/project-context.d.ts} +0 -0
  858. /package/dist/guest/{cmdline.d.ts → sessions/cmdline.d.ts} +0 -0
  859. /package/dist/guest/{ptyhost.d.ts → sessions/pty-host.d.ts} +0 -0
  860. /package/dist/guest/{view.d.ts → sessions/viewer.d.ts} +0 -0
  861. /package/dist/guest/setup/{policy.d.ts → managed-policy.d.ts} +0 -0
  862. /package/dist/host/{window.d.ts → sandbox/window.d.ts} +0 -0
  863. /package/dist/host/{wsb.d.ts → sandbox/wsb-cli.d.ts} +0 -0
  864. /package/dist/host/{cleanup.d.ts → storage/cleanup.d.ts} +0 -0
  865. /package/dist/selftest/{harness.d.ts → support/harness.d.ts} +0 -0
  866. /package/dist/selftest/{suite.d.ts → support/suite.d.ts} +0 -0
  867. /package/dist/shared/{safe-remove.d.ts → io/safe-remove.d.ts} +0 -0
  868. /package/dist/shared/{netrules.d.ts → network/firewall-rules.d.ts} +0 -0
  869. /package/dist/shared/{netpolicy.d.ts → network/policy.d.ts} +0 -0
  870. /package/dist/shared/{paths.d.ts → paths/claude-paths.d.ts} +0 -0
  871. /package/dist/shared/{projects.d.ts → paths/projects.d.ts} +0 -0
  872. /package/dist/shared/{console-input.d.ts → pty/console-input.d.ts} +0 -0
@@ -3,19 +3,28 @@
3
3
  import fs from 'node:fs';
4
4
  import path from 'node:path';
5
5
  import { spawn } from 'node:child_process';
6
- import { fetchJson, githubAsset, installArchive } from '../../shared/download.js';
7
- import { safeRemove } from '../../shared/safe-remove.js';
8
- import { copyNode, dryRun, errMsg, execAsync, exists, hostToolsDir, localDir, log, mkdirp, warn } from '../env.js';
9
- import { arch, installOnce, resolveCached, tool } from './common.js';
10
- import { duringSession } from '../project-context.js';
11
- import { pickNodeVersion, pickSpreadVersions } from './versions.js';
6
+ import { downloader, fetchJson, githubAsset } from '../../../shared/download/index.js';
7
+ import { safeRemove } from '../../../shared/io/safe-remove.js';
8
+ import { copyNode, execAsync } from '../../runtime/process.js';
9
+ import { dryRun, hostToolsDir, localDir } from '../../runtime/paths.js';
10
+ import { exists, mkdirp } from '../../runtime/fs.js';
11
+ import { log, warn } from '../../runtime/log.js';
12
+ import { errMsg } from '../../../core/util/errors.js';
13
+ import { arch, tool } from '../tool-env.js';
14
+ import { installOnce } from '../package-ledger.js';
15
+ import { resolveCached } from '../version-cache.js';
16
+ import { duringSession } from '../../runtime/project-context.js';
17
+ import { pickNodeVersion, pickSpreadVersions } from '../../../core/detect/versions.js';
12
18
  const NVM_HOME = tool('nvm');
13
19
  const NVM_SYMLINK = path.join(localDir, 'nodejs');
14
20
  const HOST_NVM = path.join(hostToolsDir, 'nvm');
15
21
  /** Most Node versions taken from this PC's nvm, the selected one included. */
16
22
  const HOST_VERSIONS_MAX = 3;
17
23
  const hostNvmVersions = () => exists(HOST_NVM)
18
- ? fs.readdirSync(HOST_NVM).filter((d) => /^v\d+\.\d+\.\d+$/.test(d) && exists(path.join(HOST_NVM, d, 'node.exe'))).map((d) => d.slice(1))
24
+ ? fs
25
+ .readdirSync(HOST_NVM)
26
+ .filter((d) => /^v\d+\.\d+\.\d+$/.test(d) && exists(path.join(HOST_NVM, d, 'node.exe')))
27
+ .map((d) => d.slice(1))
19
28
  : [];
20
29
  const resolveNode = (spec) => resolveCached('node:' + spec, async () => {
21
30
  const exact = spec.replace(/^v/, '');
@@ -29,10 +38,17 @@ const resolveNode = (spec) => resolveCached('node:' + spec, async () => {
29
38
  const NVM_TEMP = path.join(NVM_HOME, '.tmp');
30
39
  /** nvm, without blocking the event loop (`nvm install` downloads). Resolves with its output. */
31
40
  const nvm = (args) => new Promise((resolve) => {
32
- const child = spawn(path.join(NVM_HOME, 'nvm.exe'), args, { windowsHide: true, env: { ...process.env, NVM_HOME, NVM_SYMLINK, TEMP: NVM_TEMP, TMP: NVM_TEMP } });
41
+ const child = spawn(path.join(NVM_HOME, 'nvm.exe'), args, {
42
+ windowsHide: true,
43
+ env: { ...process.env, NVM_HOME, NVM_SYMLINK, TEMP: NVM_TEMP, TMP: NVM_TEMP },
44
+ });
33
45
  let out = '';
34
- child.stdout.on('data', (d) => { out += d.toString(); });
35
- child.stderr.on('data', (d) => { out += d.toString(); });
46
+ child.stdout.on('data', (d) => {
47
+ out += d.toString();
48
+ });
49
+ child.stderr.on('data', (d) => {
50
+ out += d.toString();
51
+ });
36
52
  child.once('error', (e) => resolve(out + e.message));
37
53
  child.once('close', () => resolve(out));
38
54
  });
@@ -44,7 +60,10 @@ const ensureNvm = async () => {
44
60
  log('Copying nvm from this PC ...');
45
61
  mkdirp(NVM_HOME);
46
62
  // nvm.exe last: it is what marks the install as done, so an interrupted copy is redone.
47
- const files = fs.readdirSync(HOST_NVM).filter((f) => /\.(exe|cmd|vbs)$/i.test(f)).sort((a, b) => Number(a.toLowerCase() === 'nvm.exe') - Number(b.toLowerCase() === 'nvm.exe'));
63
+ const files = fs
64
+ .readdirSync(HOST_NVM)
65
+ .filter((f) => /\.(exe|cmd|vbs)$/i.test(f))
66
+ .sort((a, b) => Number(a.toLowerCase() === 'nvm.exe') - Number(b.toLowerCase() === 'nvm.exe'));
48
67
  for (const file of files)
49
68
  fs.copyFileSync(path.join(HOST_NVM, file), path.join(NVM_HOME, file));
50
69
  return;
@@ -52,7 +71,7 @@ const ensureNvm = async () => {
52
71
  // nvm-windows 2.x only ships installers; the portable build is the newest 1.x release that has nvm-noinstall.zip.
53
72
  const asset = await githubAsset('coreybutler/nvm-windows', /^nvm-noinstall\.zip$/, true);
54
73
  log('Downloading nvm-windows (' + asset.url.split('/').slice(-2, -1)[0] + ') ...');
55
- await installArchive(asset.url, NVM_HOME, { sha256: asset.sha256, locate: 'nvm.exe', fileName: asset.name });
74
+ await downloader.archive(asset.url, NVM_HOME, { sha256: asset.sha256, locate: 'nvm.exe', fileName: asset.name });
56
75
  };
57
76
  /** A Node version: from the host's nvm when it has it (fast, offline), else `nvm install`. */
58
77
  const installNodeVersion = async (version) => {
@@ -61,7 +80,7 @@ const installNodeVersion = async (version) => {
61
80
  if (exists(path.join(dir, 'node.exe')))
62
81
  return;
63
82
  if (exists(path.join(fromHost, 'node.exe'))) {
64
- log('Copying Node ' + version + ' from this PC\'s nvm (without global packages) ...');
83
+ log('Copying Node ' + version + " from this PC's nvm (without global packages) ...");
65
84
  copyNode(fromHost, dir);
66
85
  return;
67
86
  }
@@ -84,13 +103,19 @@ const activate = async (version) => {
84
103
  fs.rmSync(NVM_SYMLINK, { recursive: true, force: true });
85
104
  fs.symlinkSync(path.join(NVM_HOME, 'v' + version), NVM_SYMLINK, 'junction');
86
105
  };
87
- export const setupNode = async (env, versions, config) => {
106
+ export async function setupNode(env, versions, config) {
88
107
  if (dryRun) {
89
108
  log('(dry run) would provision nvm and Node ' + versions.node.spec + ' (from ' + versions.node.source + ')');
90
109
  return;
91
110
  }
92
111
  await ensureNvm();
93
- fs.writeFileSync(path.join(NVM_HOME, 'settings.txt'), ['root: ' + NVM_HOME, 'path: ' + NVM_SYMLINK, 'arch: ' + (arch === 'arm64' ? 'arm64' : '64'), 'proxy: none', ''].join('\r\n'));
112
+ fs.writeFileSync(path.join(NVM_HOME, 'settings.txt'), [
113
+ 'root: ' + NVM_HOME,
114
+ 'path: ' + NVM_SYMLINK,
115
+ 'arch: ' + (arch === 'arm64' ? 'arm64' : '64'),
116
+ 'proxy: none',
117
+ '',
118
+ ].join('\r\n'));
94
119
  mkdirp(localDir);
95
120
  for (const extra of versions.nodeExtra) {
96
121
  try {
@@ -122,12 +147,15 @@ export const setupNode = async (env, versions, config) => {
122
147
  }
123
148
  env.summary.push('node: ' + main + ' (from ' + versions.node.source + ', switch with nvm use)');
124
149
  await packageManagers(env, config, main);
125
- };
150
+ }
126
151
  /** Global npm packages (per Node version, like nvm keeps them) and pnpm/yarn through corepack. */
127
152
  const packageManagers = async (env, config, version) => {
128
153
  const dir = path.join(NVM_HOME, 'v' + version);
129
154
  const nodeEnv = { ...process.env, PATH: dir + path.delimiter + (process.env.PATH ?? '') };
130
- const npm = (args) => execAsync(path.join(dir, 'node.exe'), [path.join(dir, 'node_modules', 'npm', 'bin', 'npm-cli.js'), ...args], { env: nodeEnv, stdio: 'ignore' });
155
+ const npm = (args) => execAsync(path.join(dir, 'node.exe'), [path.join(dir, 'node_modules', 'npm', 'bin', 'npm-cli.js'), ...args], {
156
+ env: nodeEnv,
157
+ stdio: 'ignore',
158
+ });
131
159
  const corepackJs = path.join(dir, 'node_modules', 'corepack', 'dist', 'corepack.js');
132
160
  // Versions copied from this PC come without their global packages, corepack included, and Node 25+ dropped it.
133
161
  const extra = config.corepack && !exists(corepackJs) ? ['corepack'] : [];
@@ -136,7 +164,12 @@ const packageManagers = async (env, config, version) => {
136
164
  return;
137
165
  // Without a packageManager pin, corepack's own known-good versions: the newest pnpm can be one this corepack cannot
138
166
  // start. Mapped folders allow no symlinks, so pnpm uses a flat (hoisted) node_modules instead of its linked layout.
139
- Object.assign(env.vars, { COREPACK_HOME: tool('corepack'), COREPACK_ENABLE_DOWNLOAD_PROMPT: '0', COREPACK_DEFAULT_TO_LATEST: '0', npm_config_node_linker: 'hoisted' });
167
+ Object.assign(env.vars, {
168
+ COREPACK_HOME: tool('corepack'),
169
+ COREPACK_ENABLE_DOWNLOAD_PROMPT: '0',
170
+ COREPACK_DEFAULT_TO_LATEST: '0',
171
+ npm_config_node_linker: 'hoisted',
172
+ });
140
173
  // The shims are shared by every session: a project added later keeps the ones made at boot.
141
174
  if (duringSession() && exists(tool('bin', 'pnpm.cmd'))) {
142
175
  env.summary.push('pnpm, yarn: via corepack');
@@ -0,0 +1,3 @@
1
+ import type { Toolchains } from '../../../core/types.js';
2
+ import { type ToolEnv } from '../tool-env.js';
3
+ export declare function setupPhp(env: ToolEnv, config: Toolchains['php']): Promise<void>;
@@ -1,19 +1,39 @@
1
1
  // PHP from windows.php.net, with Composer. Composer's global packages live in persistent storage.
2
2
  import fs from 'node:fs';
3
3
  import path from 'node:path';
4
- import { fetchJson, fetchText, installArchive } from '../../../shared/download.js';
5
- import { dryRun, execOutput, exists, log, mkdirp } from '../../env.js';
6
- import { downloadFile, resolveCached, tool, versionFromFiles } from '../common.js';
7
- import { pickPackageVersion } from '../versions.js';
8
- import { setupVcRuntime } from './vcruntime.js';
9
- const PHP_EXTENSIONS = ['curl', 'fileinfo', 'gd', 'intl', 'mbstring', 'openssl', 'pdo_mysql', 'pdo_pgsql', 'pdo_sqlite', 'sodium', 'sqlite3', 'zip'];
4
+ import { downloader, fetchJson, fetchText } from '../../../shared/download/index.js';
5
+ import { dryRun } from '../../runtime/paths.js';
6
+ import { execOutput } from '../../runtime/process.js';
7
+ import { exists, mkdirp } from '../../runtime/fs.js';
8
+ import { log } from '../../runtime/log.js';
9
+ import { downloadFile } from '../install.js';
10
+ import { resolveCached } from '../version-cache.js';
11
+ import { tool } from '../tool-env.js';
12
+ import { versionFromFiles } from '../detect.js';
13
+ import { pickPackageVersion } from '../../../core/detect/versions.js';
14
+ import { setupVcRuntime } from '../native/vcruntime.js';
15
+ const PHP_EXTENSIONS = [
16
+ 'curl',
17
+ 'fileinfo',
18
+ 'gd',
19
+ 'intl',
20
+ 'mbstring',
21
+ 'openssl',
22
+ 'pdo_mysql',
23
+ 'pdo_pgsql',
24
+ 'pdo_sqlite',
25
+ 'sodium',
26
+ 'sqlite3',
27
+ 'zip',
28
+ ];
10
29
  const COMPOSER = 'https://getcomposer.org/download/latest-stable/composer.phar';
11
30
  /** The non-thread-safe x64 zip of the newest release matching `spec` ("8" -> newest 8.x, "8.3" -> newest 8.3.x). */
12
31
  const phpBuild = async (spec) => {
13
32
  const releases = await fetchJson('https://windows.php.net/downloads/releases/releases.json');
14
33
  const pick = pickPackageVersion(Object.values(releases).map((r) => r.version), spec);
15
34
  const release = Object.values(releases).find((r) => r.version === pick);
16
- const build = release && Object.entries(release).find(([key, value]) => /^nts-vs\d+-x64$/.test(key) && typeof value === 'object' && value.zip)?.[1];
35
+ const build = release &&
36
+ Object.entries(release).find(([key, value]) => /^nts-vs\d+-x64$/.test(key) && typeof value === 'object' && value.zip)?.[1];
17
37
  if (!release || typeof build !== 'object' || !build.zip)
18
38
  throw new Error('No PHP build for Windows matches "' + spec + '"');
19
39
  return { version: release.version, ...build.zip };
@@ -23,7 +43,8 @@ const writePhpIni = (home) => {
23
43
  const ini = path.join(home, 'php.ini');
24
44
  if (exists(ini) || !exists(path.join(home, 'php.ini-development')))
25
45
  return;
26
- let text = fs.readFileSync(path.join(home, 'php.ini-development'), 'utf8')
46
+ let text = fs
47
+ .readFileSync(path.join(home, 'php.ini-development'), 'utf8')
27
48
  .replace(/^;\s*extension_dir\s*=\s*"ext"/m, 'extension_dir = "' + path.join(home, 'ext') + '"');
28
49
  for (const ext of PHP_EXTENSIONS.filter((e) => exists(path.join(home, 'ext', 'php_' + e + '.dll'))))
29
50
  text = text.replace(new RegExp('^;(extension=' + ext + ')\\s*$', 'm'), '$1');
@@ -48,7 +69,7 @@ const setupComposer = async (env, php) => {
48
69
  shim(env, 'composer', '"' + php + '" "' + phar + '"');
49
70
  env.summary.push('composer: ' + (/\d+\.\d+\.\d+/.exec(execOutput(php, [phar, '--version', '--no-ansi']))?.[0] ?? 'installed'));
50
71
  };
51
- export const setupPhp = async (env, config) => {
72
+ export async function setupPhp(env, config) {
52
73
  const wantedSpec = versionFromFiles(['.php-version']) ?? { spec: config.version, source: 'config' };
53
74
  if (dryRun) {
54
75
  log('(dry run) would provision PHP ' + wantedSpec.spec + (config.composer ? ' + Composer' : ''));
@@ -61,11 +82,15 @@ export const setupPhp = async (env, config) => {
61
82
  if (!exists(path.join(home, 'php.exe'))) {
62
83
  const build = await phpBuild(version);
63
84
  log('Downloading PHP ' + version + ' (~30 MB once) ...');
64
- await installArchive('https://windows.php.net/downloads/releases/' + build.path, home, { sha256: build.sha256, locate: 'php.exe', fileName: build.path });
85
+ await downloader.archive('https://windows.php.net/downloads/releases/' + build.path, home, {
86
+ sha256: build.sha256,
87
+ locate: 'php.exe',
88
+ fileName: build.path,
89
+ });
65
90
  }
66
91
  writePhpIni(home);
67
92
  env.prepend.push(home);
68
93
  env.summary.push('php: ' + version + ' (from ' + wantedSpec.source + ')');
69
94
  if (config.composer)
70
95
  await setupComposer(env, path.join(home, 'php.exe'));
71
- };
96
+ }
@@ -0,0 +1,3 @@
1
+ import { type ToolEnv } from '../tool-env.js';
2
+ /** Python command-line tools through uv (each in its own environment, commands in uv's bin folder on PATH). */
3
+ export declare function setupPythonTools(env: ToolEnv, tools: string[]): Promise<void>;
@@ -0,0 +1,12 @@
1
+ import { execAsync } from '../../runtime/process.js';
2
+ import { exists } from '../../runtime/fs.js';
3
+ import { tool } from '../tool-env.js';
4
+ import { installOnce } from '../package-ledger.js';
5
+ import { uvVars } from '../runtimes.js';
6
+ /** Python command-line tools through uv (each in its own environment, commands in uv's bin folder on PATH). */
7
+ export async function setupPythonTools(env, tools) {
8
+ const uv = tool('uv', 'uv.exe');
9
+ if (!exists(uv))
10
+ throw new Error('toolchains.python.tools needs uv (toolchains.uv.enabled)');
11
+ await installOnce(env, 'uv tool', tools, (pkg) => execAsync(uv, ['tool', 'install', pkg], { env: { ...process.env, ...uvVars() } }));
12
+ }
@@ -0,0 +1,3 @@
1
+ import type { Toolchains, ToolVersions } from '../../../core/types.js';
2
+ import { type ToolEnv } from '../tool-env.js';
3
+ export declare function setupPython(env: ToolEnv, config: Toolchains['python'], versions: ToolVersions): Promise<void>;
@@ -1,21 +1,25 @@
1
1
  // Python 3 and Python 2: full CPython from the official NuGet packages (portable, with pip).
2
2
  import fs from 'node:fs';
3
3
  import path from 'node:path';
4
- import { fetchJson, installArchive } from '../../shared/download.js';
5
- import { dryRun, execAsync, exists, log, mkdirp } from '../env.js';
6
- import { resolveCached, tool } from './common.js';
7
- import { pickPackageVersion } from './versions.js';
8
- import { duringSession } from '../project-context.js';
4
+ import { downloader, fetchJson } from '../../../shared/download/index.js';
5
+ import { dryRun } from '../../runtime/paths.js';
6
+ import { execAsync } from '../../runtime/process.js';
7
+ import { exists, mkdirp } from '../../runtime/fs.js';
8
+ import { log } from '../../runtime/log.js';
9
+ import { resolveCached } from '../version-cache.js';
10
+ import { tool } from '../tool-env.js';
11
+ import { pickPackageVersion } from '../../../core/detect/versions.js';
12
+ import { duringSession } from '../../runtime/project-context.js';
9
13
  const installPython = async (pkg, spec) => {
10
14
  const version = await resolveCached(pkg + ':' + spec, async () => {
11
15
  const { versions } = await fetchJson('https://api.nuget.org/v3-flatcontainer/' + pkg + '/index.json');
12
- return pickPackageVersion(versions, spec) ?? Promise.reject(new Error('No ' + pkg + ' release matches "' + spec + '"'));
16
+ return (pickPackageVersion(versions, spec) ?? Promise.reject(new Error('No ' + pkg + ' release matches "' + spec + '"')));
13
17
  });
14
18
  const dir = tool('python', pkg + '-' + version);
15
19
  const exe = path.join(dir, 'python.exe');
16
20
  if (!exists(exe)) {
17
21
  log('Downloading Python ' + version + (pkg === 'python2' ? ' (Python 2, ' : ' (') + '~30 MB once) ...');
18
- await installArchive('https://api.nuget.org/v3-flatcontainer/' + pkg + '/' + version + '/' + pkg + '.' + version + '.nupkg', dir, { locate: 'python.exe', fileName: pkg + '.' + version + '.zip' });
22
+ await downloader.archive('https://api.nuget.org/v3-flatcontainer/' + pkg + '/' + version + '/' + pkg + '.' + version + '.nupkg', dir, { locate: 'python.exe', fileName: pkg + '.' + version + '.zip' });
19
23
  }
20
24
  if (!exists(path.join(dir, 'Scripts', 'pip.exe')) && !exists(path.join(dir, 'Scripts', 'pip2.exe')))
21
25
  await execAsync(exe, ['-m', 'ensurepip', '--default-pip'], { stdio: 'ignore' });
@@ -26,14 +30,20 @@ const installPython = async (pkg, spec) => {
26
30
  * so the boot project's python3.cmd keeps pointing at its own version.
27
31
  */
28
32
  const shimDir = (dir) => (duringSession() ? tool('shims', path.basename(dir)) : tool('shims'));
29
- /** Writes `<name>.cmd` into the shims folder, e.g. python2.cmd. */
30
- const shim = (folder, name, command) => {
31
- fs.writeFileSync(path.join(mkdirp(folder), name + '.cmd'), '@echo off\r\n' + command + ' %*\r\n');
33
+ /**
34
+ * Writes `<name>.cmd` (cmd, PowerShell) and `<name>` (Git Bash, which runs neither .cmd nor .bat by bare name) into
35
+ * the shims folder, both running `program` with `args` and then the caller's arguments, e.g. python2.
36
+ */
37
+ const shim = (folder, name, program, args = []) => {
38
+ const fixed = [program, ...args];
39
+ fs.writeFileSync(path.join(mkdirp(folder), name + '.cmd'), '@echo off\r\n' + fixed.map((a) => '"' + a + '"').join(' ') + ' %*\r\n');
40
+ const sh = fixed.map((a) => "'" + a.replace(/\\/g, '/').replace(/'/g, "'\\''") + "'").join(' ');
41
+ fs.writeFileSync(path.join(folder, name), '#!/bin/sh\nexec ' + sh + ' "$@"\n');
32
42
  };
33
43
  const shimPair = (folder, version, dir) => {
34
- const python = '"' + path.join(dir, 'python.exe') + '"';
44
+ const python = path.join(dir, 'python.exe');
35
45
  shim(folder, 'python' + version, python);
36
- shim(folder, 'pip' + version, python + ' -m pip');
46
+ shim(folder, 'pip' + version, python, ['-m', 'pip']);
37
47
  };
38
48
  /**
39
49
  * `py` like the Python launcher Windows installs: `py -3 x.py`, `py -3.12 ...`, `py -2 ...`, `py x.py`. The launcher
@@ -43,7 +53,10 @@ const pyLauncher = (folder, py3, py2) => {
43
53
  const script = path.join(mkdirp(folder), 'py-launcher.py');
44
54
  fs.writeFileSync(script, [
45
55
  'import subprocess, sys',
46
- 'PY3, PY2 = ' + JSON.stringify(path.join(py3, 'python.exe')) + ', ' + JSON.stringify(py2 ? path.join(py2, 'python.exe') : null),
56
+ 'PY3, PY2 = ' +
57
+ JSON.stringify(path.join(py3, 'python.exe')) +
58
+ ', ' +
59
+ JSON.stringify(py2 ? path.join(py2, 'python.exe') : null),
47
60
  'args = sys.argv[1:]',
48
61
  'exe = PY3',
49
62
  "if args and args[0].startswith('-2'):",
@@ -54,9 +67,9 @@ const pyLauncher = (folder, py3, py2) => {
54
67
  'sys.exit(subprocess.call([exe] + args))',
55
68
  '',
56
69
  ].join('\n'));
57
- shim(folder, 'py', '"' + path.join(py3, 'python.exe') + '" "' + script + '"');
70
+ shim(folder, 'py', path.join(py3, 'python.exe'), [script]);
58
71
  };
59
- export const setupPython = async (env, config, versions) => {
72
+ export async function setupPython(env, config, versions) {
60
73
  if (dryRun) {
61
74
  log('(dry run) would provision Python ' + versions.python.spec + (config.python2 ? ' and Python 2.7' : ''));
62
75
  return;
@@ -75,4 +88,4 @@ export const setupPython = async (env, config, versions) => {
75
88
  shimPair(shims, '2', py2);
76
89
  pyLauncher(shims, py3, py2);
77
90
  env.summary.push('python2: ' + path.basename(py2).replace('python2-', ''));
78
- };
91
+ }
@@ -0,0 +1,3 @@
1
+ import type { Toolchains } from '../../../core/types.js';
2
+ import { type ToolEnv } from '../tool-env.js';
3
+ export declare function setupRuby(env: ToolEnv, config: Toolchains['ruby']): Promise<void>;
@@ -1,10 +1,16 @@
1
1
  // Ruby from RubyInstaller. Gems live in persistent storage.
2
2
  import path from 'node:path';
3
- import { fetchJson, installArchive } from '../../../shared/download.js';
3
+ import { downloader, fetchJson } from '../../../shared/download/index.js';
4
4
  import { SYSTEM } from '../../../shared/system.js';
5
- import { dryRun, execAsync, exists, log } from '../../env.js';
6
- import { installOnce, resolveCached, tool, versionFromFiles, versionOf } from '../common.js';
7
- import { pickPackageVersion } from '../versions.js';
5
+ import { dryRun } from '../../runtime/paths.js';
6
+ import { execAsync } from '../../runtime/process.js';
7
+ import { exists } from '../../runtime/fs.js';
8
+ import { log } from '../../runtime/log.js';
9
+ import { installOnce } from '../package-ledger.js';
10
+ import { resolveCached } from '../version-cache.js';
11
+ import { tool, versionOf } from '../tool-env.js';
12
+ import { versionFromFiles } from '../detect.js';
13
+ import { pickPackageVersion } from '../../../core/detect/versions.js';
8
14
  const RUBY_ASSET = /^rubyinstaller-(\d+\.\d+\.\d+)-(\d+)-x64\.7z$/;
9
15
  /** The build number after the version in a RubyInstaller file name (rubyinstaller-3.3.1-1-x64.7z -> 1). */
10
16
  const buildNumber = (asset) => Number(RUBY_ASSET.exec(asset.name)?.[2] ?? 0);
@@ -23,25 +29,37 @@ const rubyBuilds = async () => {
23
29
  return builds;
24
30
  };
25
31
  const sha256Of = (asset) => (asset.digest?.startsWith('sha256:') ? asset.digest.slice(7) : null);
26
- export const setupRuby = async (env, config) => {
32
+ export async function setupRuby(env, config) {
27
33
  const wantedSpec = versionFromFiles(['.ruby-version']) ?? { spec: config.version, source: 'config' };
28
34
  if (dryRun) {
29
35
  log('(dry run) would provision Ruby ' + wantedSpec.spec);
30
36
  return;
31
37
  }
32
- const version = await resolveCached('ruby:' + wantedSpec.spec, async () => pickPackageVersion([...(await rubyBuilds()).keys()], wantedSpec.spec) ?? Promise.reject(new Error('No RubyInstaller build matches "' + wantedSpec.spec + '"')));
38
+ const version = await resolveCached('ruby:' + wantedSpec.spec, async () => pickPackageVersion([...(await rubyBuilds()).keys()], wantedSpec.spec) ??
39
+ Promise.reject(new Error('No RubyInstaller build matches "' + wantedSpec.spec + '"')));
33
40
  const home = tool('ruby', version);
34
41
  if (!exists(path.join(home, 'bin', 'ruby.exe'))) {
35
42
  const asset = (await rubyBuilds()).get(version);
36
43
  if (!asset)
37
44
  throw new Error('RubyInstaller ' + version + ' is no longer published');
38
45
  log('Downloading Ruby ' + version + ' (~100 MB once) ...');
39
- await installArchive(asset.browser_download_url, home, { sha256: sha256Of(asset), locate: 'ruby.exe', up: 1, fileName: asset.name });
46
+ await downloader.archive(asset.browser_download_url, home, {
47
+ sha256: sha256Of(asset),
48
+ locate: 'ruby.exe',
49
+ up: 1,
50
+ fileName: asset.name,
51
+ });
40
52
  }
41
53
  const gems = tool('ruby-gems', version.split('.').slice(0, 2).join('.'));
42
54
  Object.assign(env.vars, { GEM_HOME: gems, BUNDLE_USER_HOME: tool('bundle-home') });
43
55
  env.prepend.push(path.join(home, 'bin'), path.join(gems, 'bin'));
44
- env.summary.push('ruby: ' + versionOf(path.join(home, 'bin', 'ruby.exe')) + ' (from ' + wantedSpec.source + '; gems with C extensions need MSYS2, not included)');
56
+ env.summary.push('ruby: ' +
57
+ versionOf(path.join(home, 'bin', 'ruby.exe')) +
58
+ ' (from ' +
59
+ wantedSpec.source +
60
+ '; gems with C extensions need MSYS2, not included)');
45
61
  const gem = path.join(home, 'bin', 'gem.cmd');
46
- await installOnce(env, 'gem@' + version, config.gems, (pkg) => execAsync(SYSTEM.cmd(), ['/d', '/c', gem, 'install', pkg, '--no-document'], { env: { ...process.env, GEM_HOME: gems } }));
47
- };
62
+ await installOnce(env, 'gem@' + version, config.gems, (pkg) => execAsync(SYSTEM.cmd(), ['/d', '/c', gem, 'install', pkg, '--no-document'], {
63
+ env: { ...process.env, GEM_HOME: gems },
64
+ }));
65
+ }
@@ -1,2 +1,2 @@
1
1
  /** Removes helper builds older versions left in persistent storage, and interrupted installs' staging folders. */
2
- export declare const pruneToolLeftovers: () => void;
2
+ export declare function pruneToolLeftovers(): void;
@@ -1,20 +1,22 @@
1
1
  // Clean-up of what interrupted or older installs left in the tools folder.
2
2
  import fs from 'node:fs';
3
3
  import path from 'node:path';
4
- import { safeRemove } from '../../shared/safe-remove.js';
5
- import { toolsDir } from '../env.js';
4
+ import { safeRemove } from '../../shared/io/safe-remove.js';
5
+ import { toolsDir } from '../runtime/paths.js';
6
6
  const STAGING = /\.staging-[0-9a-f]+$/i;
7
- const entries = (dir) => { try {
8
- return fs.readdirSync(dir, { withFileTypes: true });
9
- }
10
- catch {
11
- return [];
12
- } };
7
+ const entries = (dir) => {
8
+ try {
9
+ return fs.readdirSync(dir, { withFileTypes: true });
10
+ }
11
+ catch {
12
+ return [];
13
+ }
14
+ };
13
15
  /** Removes helper builds older versions left in persistent storage, and interrupted installs' staging folders. */
14
- export const pruneToolLeftovers = () => {
16
+ export function pruneToolLeftovers() {
15
17
  for (const legacy of ['ptyhost', 'gitshim'])
16
18
  safeRemove(path.join(toolsDir, legacy), toolsDir);
17
- // Staging folders sit next to their destination: tools\x.staging-ab12 and one level down (tools\nvm\v22.staging-ab12).
19
+ // Staging folders sit next to their destination: tools\x.staging-ab12 and a level down (tools\nvm\v22.staging-ab12).
18
20
  for (const top of entries(toolsDir)) {
19
21
  const dir = path.join(toolsDir, top.name);
20
22
  if (STAGING.test(top.name))
@@ -23,4 +25,4 @@ export const pruneToolLeftovers = () => {
23
25
  for (const sub of entries(dir).filter((e) => STAGING.test(e.name)))
24
26
  safeRemove(path.join(dir, sub.name), dir);
25
27
  }
26
- };
28
+ }
@@ -1,16 +1,16 @@
1
1
  import type { Toolchains } from '../../core/types.js';
2
- import { type ToolEnv } from './common.js';
2
+ import { type ToolEnv } from './tool-env.js';
3
3
  /** The "volta" block of the workspace's package.json ({ node, npm, yarn, pnpm }), if any. */
4
- export declare const voltaPins: () => Record<string, string>;
5
- export declare const wantsVolta: (setting: Toolchains["node"]["volta"]) => boolean;
6
- export declare const wantsPyenv: (setting: Toolchains["python"]["pyenv"]) => boolean;
4
+ export declare function voltaPins(): Record<string, string>;
5
+ export declare function wantsVolta(setting: Toolchains['node']['volta']): boolean;
6
+ export declare function wantsPyenv(setting: Toolchains['python']['pyenv']): boolean;
7
7
  /**
8
8
  * Volta from its portable zip. With pins, its shims go first on PATH (the project gets exactly what package.json says,
9
9
  * fetched ahead of time); without, Volta is just available and nvm's Node stays the default.
10
10
  */
11
- export declare const setupVolta: (env: ToolEnv) => Promise<void>;
11
+ export declare function setupVolta(env: ToolEnv): Promise<void>;
12
12
  /**
13
13
  * pyenv-win from its source archive (it ships no release assets). Its versions persist in tools\pyenv. It comes after
14
14
  * the Python step on PATH, so `python` is the sandbox's own until you `pyenv install` / `pyenv local`.
15
15
  */
16
- export declare const setupPyenv: (env: ToolEnv) => Promise<void>;
16
+ export declare function setupPyenv(env: ToolEnv): Promise<void>;
@@ -2,27 +2,38 @@
2
2
  // the Python step still provide the default versions; these come along when the project or this PC uses them.
3
3
  import fs from 'node:fs';
4
4
  import path from 'node:path';
5
- import { installArchive, latestGithubTag } from '../../shared/download.js';
6
- import { dryRun, errMsg, execAsync, exists, log, mkdirp, session, warn } from '../env.js';
7
- import { projectWorkspace } from '../project-context.js';
8
- import { arch, installFromGithub, resolveCached, tool, versionOf } from './common.js';
5
+ import { downloader, latestGithubTag } from '../../shared/download/index.js';
6
+ import { dryRun } from '../runtime/paths.js';
7
+ import { execAsync } from '../runtime/process.js';
8
+ import { exists, mkdirp } from '../runtime/fs.js';
9
+ import { log, warn } from '../runtime/log.js';
10
+ import { session } from '../runtime/session.js';
11
+ import { errMsg } from '../../core/util/errors.js';
12
+ import { projectWorkspace } from '../runtime/project-context.js';
13
+ import { arch, tool, versionOf } from './tool-env.js';
14
+ import { installFromGithub } from './install.js';
15
+ import { resolveCached } from './version-cache.js';
9
16
  /** The "volta" block of the workspace's package.json ({ node, npm, yarn, pnpm }), if any. */
10
- export const voltaPins = () => {
17
+ export function voltaPins() {
11
18
  try {
12
- const pkg = JSON.parse(fs.readFileSync(path.join(projectWorkspace(), 'package.json'), 'utf8').replace(/^/, ''));
19
+ const pkg = JSON.parse(fs.readFileSync(path.join(projectWorkspace(), 'package.json'), 'utf8').replace(/^\uFEFF/, ''));
13
20
  return Object.fromEntries(Object.entries(pkg.volta ?? {}).filter((e) => ['node', 'npm', 'yarn', 'pnpm'].includes(e[0]) && typeof e[1] === 'string'));
14
21
  }
15
22
  catch {
16
23
  return {};
17
24
  }
18
- };
19
- export const wantsVolta = (setting) => setting === 'auto' ? Object.keys(voltaPins()).length > 0 || Boolean(session.hostTools.volta) : setting;
20
- export const wantsPyenv = (setting) => setting === 'auto' ? Boolean(session.hostTools.pyenv) : setting;
25
+ }
26
+ export function wantsVolta(setting) {
27
+ return setting === 'auto' ? Object.keys(voltaPins()).length > 0 || Boolean(session.hostTools.volta) : setting;
28
+ }
29
+ export function wantsPyenv(setting) {
30
+ return setting === 'auto' ? Boolean(session.hostTools.pyenv) : setting;
31
+ }
21
32
  /**
22
33
  * Volta from its portable zip. With pins, its shims go first on PATH (the project gets exactly what package.json says,
23
34
  * fetched ahead of time); without, Volta is just available and nvm's Node stays the default.
24
35
  */
25
- export const setupVolta = async (env) => {
36
+ export async function setupVolta(env) {
26
37
  if (dryRun) {
27
38
  log('(dry run) would provision Volta');
28
39
  return;
@@ -30,7 +41,11 @@ export const setupVolta = async (env) => {
30
41
  const dir = tool('volta');
31
42
  if (!exists(path.join(dir, 'volta.exe'))) {
32
43
  const pattern = arch === 'arm64' ? /^volta-[\d.]+-windows-arm64\.zip$/ : /^volta-[\d.]+-windows\.zip$/;
33
- await installFromGithub('volta-cli/volta', pattern, { dest: dir, what: 'Volta (~15 MB once)', locate: 'volta.exe' });
44
+ await installFromGithub('volta-cli/volta', pattern, {
45
+ dest: dir,
46
+ what: 'Volta (~15 MB once)',
47
+ locate: 'volta.exe',
48
+ });
34
49
  }
35
50
  // The MSI puts these shims (copies of volta-shim.exe) next to volta.exe; the portable zip leaves that to us.
36
51
  for (const shim of ['node', 'npm', 'npx', 'pnpm', 'pnpx', 'yarn', 'yarnpkg']) {
@@ -51,21 +66,27 @@ export const setupVolta = async (env) => {
51
66
  // `volta install` fetches the pinned versions now (not on the agent's first `node`) and makes them the defaults.
52
67
  for (const [toolName, version] of Object.entries(pins)) {
53
68
  try {
54
- await execAsync(volta, ['install', toolName + '@' + version], { env: { ...process.env, ...vars }, cwd: projectWorkspace(), stdio: 'ignore' });
69
+ await execAsync(volta, ['install', toolName + '@' + version], {
70
+ env: { ...process.env, ...vars },
71
+ cwd: projectWorkspace(),
72
+ stdio: 'ignore',
73
+ });
55
74
  }
56
75
  catch (e) {
57
76
  warn('Volta could not install ' + toolName + '@' + version + ': ' + errMsg(e));
58
77
  }
59
78
  }
60
79
  const pinned = Object.entries(pins).map(([k, v]) => k + '@' + v);
61
- const note = pinned.length ? ' (pins from package.json: ' + pinned.join(', ') + ')' : ' (no pins in this project; nvm\'s node is the default)';
80
+ const note = pinned.length
81
+ ? ' (pins from package.json: ' + pinned.join(', ') + ')'
82
+ : " (no pins in this project; nvm's node is the default)";
62
83
  env.summary.push('volta: ' + versionOf(volta) + note);
63
- };
84
+ }
64
85
  /**
65
86
  * pyenv-win from its source archive (it ships no release assets). Its versions persist in tools\pyenv. It comes after
66
87
  * the Python step on PATH, so `python` is the sandbox's own until you `pyenv install` / `pyenv local`.
67
88
  */
68
- export const setupPyenv = async (env) => {
89
+ export async function setupPyenv(env) {
69
90
  if (dryRun) {
70
91
  log('(dry run) would provision pyenv-win');
71
92
  return;
@@ -75,10 +96,10 @@ export const setupPyenv = async (env) => {
75
96
  const tag = await resolveCached('pyenv-win', () => latestGithubTag('pyenv-win/pyenv-win'));
76
97
  log('Downloading pyenv-win ' + tag + ' (~5 MB once) ...');
77
98
  // GitHub's tag archive: no published checksum, but HTTPS from github.com for the project's own tag.
78
- await installArchive('https://github.com/pyenv-win/pyenv-win/archive/refs/tags/' + encodeURIComponent(tag) + '.zip', root, { locate: 'pyenv.bat', up: 1, fileName: 'pyenv-win.zip' });
99
+ await downloader.archive('https://github.com/pyenv-win/pyenv-win/archive/refs/tags/' + encodeURIComponent(tag) + '.zip', root, { locate: 'pyenv.bat', up: 1, fileName: 'pyenv-win.zip' });
79
100
  }
80
101
  const home = root + path.sep;
81
102
  Object.assign(env.vars, { PYENV: home, PYENV_ROOT: home, PYENV_HOME: home });
82
103
  env.append.push(path.join(root, 'bin'), path.join(root, 'shims'));
83
104
  env.summary.push('pyenv-win: pyenv install <version> / pyenv local <version> (versions persist)');
84
- };
105
+ }
@@ -2,6 +2,7 @@ import type { SpawnOptions } from 'node:child_process';
2
2
  /**
3
3
  * Returns the installer for one crate: `cargo binstall` (prebuilt only: its own compile fallback is off, so a crate
4
4
  * without a Windows build is compiled by our `cargo install` with the linker settings in `cargoEnv`), then
5
- * `cargo install --locked`. cargo-binstall is fetched on first use, so boots with every crate installed download nothing.
5
+ * `cargo install --locked`. cargo-binstall is fetched on first use, so boots with every crate installed download
6
+ * nothing.
6
7
  */
7
- export declare const crateInstaller: (cargoHome: string, cargoEnv: SpawnOptions) => ((crate: string) => Promise<void>);
8
+ export declare function crateInstaller(cargoHome: string, cargoEnv: SpawnOptions): (crate: string) => Promise<void>;