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,9 +3,12 @@
3
3
  /** Turns an .nvmrc-style spec (20, v20.11.1, lts/*, lts/iron, node, latest) into an exact version like 20.11.1. */
4
4
  export const pickNodeVersion = (releases, spec) => {
5
5
  const s = spec.trim().toLowerCase().replace(/^v/, '');
6
- const hit = ['node', 'latest', 'current', 'stable'].includes(s) ? releases[0]
7
- : s === 'lts' || s === 'lts/*' ? releases.find((r) => r.lts)
8
- : s.startsWith('lts/') ? releases.find((r) => typeof r.lts === 'string' && r.lts.toLowerCase() === s.slice(4))
6
+ const hit = ['node', 'latest', 'current', 'stable'].includes(s)
7
+ ? releases[0]
8
+ : s === 'lts' || s === 'lts/*'
9
+ ? releases.find((r) => r.lts)
10
+ : s.startsWith('lts/')
11
+ ? releases.find((r) => typeof r.lts === 'string' && r.lts.toLowerCase() === s.slice(4))
9
12
  : releases.find((r) => r.version === 'v' + s || r.version.startsWith('v' + s + '.'));
10
13
  return hit ? hit.version.slice(1) : null;
11
14
  };
@@ -19,19 +22,26 @@ export const pickSpreadVersions = (available, current, max) => {
19
22
  const newestPerMajor = exact.filter((v, i) => exact[i + 1]?.split('.')[0] !== v.split('.')[0]);
20
23
  const pool = newestPerMajor.filter((v) => v.split('.')[0] !== current.split('.')[0]);
21
24
  const want = Math.max(0, max - 1);
22
- const picked = want >= pool.length ? pool
23
- : want === 1 ? [pool[pool.length - 1]]
24
- : Array.from({ length: want }, (_, i) => pool[Math.round(i * (pool.length - 1) / (want - 1))]);
25
+ const picked = want >= pool.length
26
+ ? pool
27
+ : want === 1
28
+ ? [pool[pool.length - 1]]
29
+ : Array.from({ length: want }, (_, i) => pool[Math.round((i * (pool.length - 1)) / (want - 1))]);
25
30
  return [current, ...picked];
26
31
  };
27
32
  /** Newest stable version matching a prefix spec ("3" -> 3.13.1, "3.12" -> 3.12.10). */
28
33
  export const pickPackageVersion = (all, spec) => {
29
34
  const s = spec.trim().replace(/^python-?/i, '');
30
- const stable = all.filter((v) => /^\d+(\.\d+)*$/.test(v)).sort((a, b) => b.localeCompare(a, undefined, { numeric: true }));
35
+ const stable = all
36
+ .filter((v) => /^\d+(\.\d+)*$/.test(v))
37
+ .sort((a, b) => b.localeCompare(a, undefined, { numeric: true }));
31
38
  return stable.find((v) => v === s || v.startsWith(s + '.')) ?? null;
32
39
  };
33
40
  /** Version spec from a version file's text (.ruby-version "ruby-3.3.1", .java-version "temurin-21", ...): its first x[.y[.z]]. */
34
- export const specFromVersionFile = (text) => /(\d+(?:\.\d+){0,2})/.exec(text.split(/\r?\n/).map((l) => l.replace(/#.*$/, '').trim()).find(Boolean) ?? '')?.[1] ?? null;
41
+ export const specFromVersionFile = (text) => /(\d+(?:\.\d+){0,2})/.exec(text
42
+ .split(/\r?\n/)
43
+ .map((l) => l.replace(/#.*$/, '').trim())
44
+ .find(Boolean) ?? '')?.[1] ?? null;
35
45
  /** Java major version from .java-version ("21", "17.0.9", "1.8", "temurin-21") or .sdkmanrc ("java=21.0.2-tem"). */
36
46
  export const javaMajorFrom = (text, sdkmanrc = false) => {
37
47
  const line = sdkmanrc ? /^\s*java\s*=\s*(.+)$/m.exec(text)?.[1] : text;
@@ -55,23 +65,29 @@ export const pickGoRelease = (releases, spec) => {
55
65
  */
56
66
  export const projectUses = (entries, markers) => entries.some((entry) => {
57
67
  const name = entry.split(/[\/]/).pop().toLowerCase();
58
- return markers.some((m) => (m.startsWith('*.') ? name.endsWith(m.slice(1).toLowerCase()) : name === m.toLowerCase()));
68
+ return markers.some((m) => m.startsWith('*.') ? name.endsWith(m.slice(1).toLowerCase()) : name === m.toLowerCase());
59
69
  });
60
70
  /** Newest MSVC tools version among VS manifest package ids ("microsoft.vc.14.44.17.14.tools.hostx64.targetx64.base"). */
61
71
  export const pickMsvcVersion = (packageIds, spec = 'latest') => {
62
- const versions = packageIds.map((id) => /^microsoft\.vc\.(\d+\.\d+\.\d+\.\d+)\.tools\.hostx64\.targetx64\.base$/i.exec(id)?.[1]).filter((v) => Boolean(v));
72
+ const versions = packageIds
73
+ .map((id) => /^microsoft\.vc\.(\d+\.\d+\.\d+\.\d+)\.tools\.hostx64\.targetx64\.base$/i.exec(id)?.[1])
74
+ .filter((v) => Boolean(v));
63
75
  const sorted = [...new Set(versions)].sort((a, b) => b.localeCompare(a, undefined, { numeric: true }));
64
76
  return (spec === 'latest' ? sorted[0] : sorted.find((v) => v === spec || v.startsWith(spec + '.'))) ?? null;
65
77
  };
66
78
  /** Newest Windows SDK build among component ids ("microsoft.visualstudio.component.windows11sdk.26100"). */
67
79
  export const pickWindowsSdk = (packageIds, spec = 'latest') => {
68
- const found = packageIds.map((id) => ({ id, build: /^microsoft\.visualstudio\.component\.windows1[01]sdk\.(\d+)$/i.exec(id)?.[1] })).filter((x) => Boolean(x.build));
80
+ const found = packageIds
81
+ .map((id) => ({ id, build: /^microsoft\.visualstudio\.component\.windows1[01]sdk\.(\d+)$/i.exec(id)?.[1] }))
82
+ .filter((x) => Boolean(x.build));
69
83
  const sorted = found.sort((a, b) => Number(b.build) - Number(a.build));
70
84
  const hit = spec === 'latest' ? sorted[0] : sorted.find((x) => x.build === spec.replace(/^10\.0\./, '').split('.')[0]);
71
85
  return hit ? { build: hit.build, componentId: hit.id } : null;
72
86
  };
73
87
  /** The .cab files an SDK .msi refers to (their names are inside the msi as plain "<32 hex>.cab"). */
74
- export const msiCabs = (msi) => [...new Set([...msi.toString('latin1').matchAll(/([0-9a-f]{32}\.cab)/gi)].map((m) => m[1].toLowerCase()))];
88
+ export const msiCabs = (msi) => [
89
+ ...new Set([...msi.toString('latin1').matchAll(/([0-9a-f]{32}\.cab)/gi)].map((m) => m[1].toLowerCase())),
90
+ ];
75
91
  /** The oldest CMake many projects (OpenMoHAA among them) accept. */
76
92
  export const CMAKE_FLOOR = '3.25';
77
93
  export const cmakeTooOld = (version) => /^\d+\.\d+/.test(version) && version.localeCompare(CMAKE_FLOOR, undefined, { numeric: true }) < 0;
@@ -3,6 +3,8 @@ export declare const GB: number;
3
3
  export declare const humanBytes: (bytes: number) => string;
4
4
  /** Size on disk, never following links or junctions (a link counts as 0, so a planted junction cannot make us walk this PC's disk). */
5
5
  export declare const sizeOf: (p: string) => number;
6
+ /** sizeOf with a time budget: null when measuring would take longer than `ms` (a big data folder can take minutes). */
7
+ export declare const sizeWithin: (p: string, ms: number) => number | null;
6
8
  /** Free bytes on the drive that holds `dir` (which may not exist yet: the nearest existing parent is asked); null if unknown. */
7
9
  export declare const freeBytesAt: (dir: string) => number | null;
8
10
  export interface DiskUsage {
package/dist/core/disk.js CHANGED
@@ -18,12 +18,44 @@ export const sizeOf = (p) => {
18
18
  return 0;
19
19
  if (!stat.isDirectory())
20
20
  return stat.size;
21
- return _.sumBy(fs.readdirSync(p, { withFileTypes: true }), (d) => (d.isSymbolicLink() ? 0 : sizeOf(path.join(p, d.name))));
21
+ return _.sumBy(fs.readdirSync(p, { withFileTypes: true }), (d) => d.isSymbolicLink() ? 0 : sizeOf(path.join(p, d.name)));
22
22
  }
23
23
  catch {
24
24
  return 0;
25
25
  }
26
26
  };
27
+ /** sizeOf with a time budget: null when measuring would take longer than `ms` (a big data folder can take minutes). */
28
+ export const sizeWithin = (p, ms) => {
29
+ const deadline = Date.now() + ms;
30
+ const overBudget = Symbol('over budget');
31
+ const walk = (at) => {
32
+ if (Date.now() > deadline)
33
+ throw overBudget;
34
+ let stat;
35
+ let entries = [];
36
+ try {
37
+ stat = fs.lstatSync(at);
38
+ if (stat.isDirectory() && !stat.isSymbolicLink())
39
+ entries = fs.readdirSync(at, { withFileTypes: true });
40
+ }
41
+ catch {
42
+ return 0; /* gone or unreadable: counts as nothing, like sizeOf */
43
+ }
44
+ if (stat.isSymbolicLink())
45
+ return 0;
46
+ if (!stat.isDirectory())
47
+ return stat.size;
48
+ return _.sumBy(entries, (d) => (d.isSymbolicLink() ? 0 : walk(path.join(at, d.name))));
49
+ };
50
+ try {
51
+ return walk(p);
52
+ }
53
+ catch (e) {
54
+ if (e === overBudget)
55
+ return null;
56
+ throw e;
57
+ }
58
+ };
27
59
  /** Free bytes on the drive that holds `dir` (which may not exist yet: the nearest existing parent is asked); null if unknown. */
28
60
  export const freeBytesAt = (dir) => {
29
61
  let at = path.resolve(dir);
@@ -40,13 +72,24 @@ export const freeBytesAt = (dir) => {
40
72
  /** Every local drive's size and free space, and which one holds the sandbox storage. */
41
73
  export const diskUsage = (storageRoot) => {
42
74
  const storageDrive = path.parse(path.resolve(storageRoot)).root.toUpperCase();
43
- return 'CDEFGHIJKLMNOPQRSTUVWXYZ'.split('').map((letter) => letter + ':\\').flatMap((drive) => {
75
+ return 'CDEFGHIJKLMNOPQRSTUVWXYZ'
76
+ .split('')
77
+ .map((letter) => letter + ':\\')
78
+ .flatMap((drive) => {
44
79
  try {
45
80
  const s = fs.statfsSync(drive);
46
81
  const totalBytes = s.blocks * s.bsize;
47
82
  if (!totalBytes)
48
83
  return [];
49
- return [{ drive, totalBytes, freeBytes: s.bavail * s.bsize, usedBytes: totalBytes - s.bfree * s.bsize, holdsStorage: drive.toUpperCase() === storageDrive }];
84
+ return [
85
+ {
86
+ drive,
87
+ totalBytes,
88
+ freeBytes: s.bavail * s.bsize,
89
+ usedBytes: totalBytes - s.bfree * s.bsize,
90
+ holdsStorage: drive.toUpperCase() === storageDrive,
91
+ },
92
+ ];
50
93
  }
51
94
  catch {
52
95
  return [];
@@ -0,0 +1,45 @@
1
+ import type { Config, ResolvedMapping } from '../types.js';
2
+ import type { Protections } from './policy.js';
3
+ /** .wsb devices a project may want on (only when your settings or your answer for that project allow it). */
4
+ export declare const BOOT_SETTINGS: string[];
5
+ /** What the running sandbox booted with (host-only registry). */
6
+ export interface BootRecord {
7
+ memoryMb: number | null;
8
+ mappings: ResolvedMapping[];
9
+ }
10
+ /** What a project wants that the running sandbox started without. */
11
+ export interface Missing {
12
+ settings: string[];
13
+ memoryMb: number | null;
14
+ mappings: ResolvedMapping[];
15
+ }
16
+ /** A project mapped at boot besides the launch folder, with its effective config. */
17
+ export interface BootWant {
18
+ name: string;
19
+ config: Config;
20
+ }
21
+ export interface Widened {
22
+ config: Config;
23
+ /** Setting -> the project it was turned on for. */
24
+ widened: Record<string, string>;
25
+ notes: string[];
26
+ }
27
+ /**
28
+ * The boot-only things `config` (a project's effective config: your settings, its approved file, your answers) asks
29
+ * for that the running sandbox lacks. `exists`: optional mappings whose folder is missing are no wish.
30
+ */
31
+ export declare function missingAtBoot(running: Protections, boot: BootRecord, config: Config, exists?: (folder: string) => boolean): Missing;
32
+ export declare function nothingMissing(m: Missing): boolean;
33
+ /** "mw2-agent wants vGPU and 2 folders (C:\Steam\..., F:\SteamLibrary\...), but this sandbox started without them." */
34
+ export declare function describeMissing(project: string, m: Missing): string;
35
+ /** "Set sandbox.vGpu (or the mappings) in your own settings to have them in every sandbox." */
36
+ export declare function missingTip(m: Missing): string;
37
+ /**
38
+ * The launch folder's config plus what the other projects mapped at boot want: their allowed .wsb devices, a fixed
39
+ * memory size larger than the launch's, and their mappings (placed with every other mapping at launch).
40
+ * `keepOff`: devices the launch folder's own .sandbox-config.json switched off; they stay off.
41
+ */
42
+ export declare function widenForProjects(launch: Config, others: readonly BootWant[], opts?: {
43
+ keepOff?: readonly string[];
44
+ exists?: (folder: string) => boolean;
45
+ }): Widened;
@@ -0,0 +1,120 @@
1
+ // What a project WANTS at boot (a .wsb device you allowed for it, more memory, its mappings) and the running sandbox
2
+ // started without. Those can only come with a restart, so they are named (missingAtBoot), and a sandbox started with
3
+ // several projects boots with all of their allowed wants (widenForProjects). Pure.
4
+ import _ from 'lodash';
5
+ /** .wsb devices a project may want on (only when your settings or your answer for that project allow it). */
6
+ export const BOOT_SETTINGS = [
7
+ 'sandbox.vGpu',
8
+ 'sandbox.networking',
9
+ 'sandbox.clipboard',
10
+ 'sandbox.audioInput',
11
+ 'sandbox.videoInput',
12
+ 'sandbox.printerRedirection',
13
+ ];
14
+ const LABELS = {
15
+ 'sandbox.vGpu': 'vGPU',
16
+ 'sandbox.networking': 'networking',
17
+ 'sandbox.clipboard': 'the shared clipboard',
18
+ 'sandbox.audioInput': 'the microphone',
19
+ 'sandbox.videoInput': 'the camera',
20
+ 'sandbox.printerRedirection': 'printers',
21
+ };
22
+ function sameHost(a, b) {
23
+ return a.toLowerCase().replace(/\\+$/, '') === b.toLowerCase().replace(/\\+$/, '');
24
+ }
25
+ /** `m`'s folder is mapped, wherever the launch placed it (read-only is enough for a read-only wish). */
26
+ function isMapped(mapped, m) {
27
+ return mapped.some((x) => sameHost(x.host, m.host) && (m.readOnly || !x.readOnly));
28
+ }
29
+ function listing(items) {
30
+ return items.length <= 1 ? items.join('') : items.slice(0, -1).join(', ') + ' and ' + items[items.length - 1];
31
+ }
32
+ /**
33
+ * The boot-only things `config` (a project's effective config: your settings, its approved file, your answers) asks
34
+ * for that the running sandbox lacks. `exists`: optional mappings whose folder is missing are no wish.
35
+ */
36
+ export function missingAtBoot(running, boot, config, exists = () => true) {
37
+ const memory = config.sandbox.memoryMb;
38
+ return {
39
+ settings: BOOT_SETTINGS.filter((s) => _.get(config, s) === true && running[s] === false),
40
+ memoryMb: typeof memory === 'number' && boot.memoryMb !== null && memory > boot.memoryMb ? memory : null,
41
+ mappings: config.mappings
42
+ .filter((m) => (!m.optional || exists(m.host)) && !isMapped(boot.mappings, m))
43
+ .map((m) => ({ host: m.host, guest: m.guest ?? m.host, readOnly: m.readOnly })),
44
+ };
45
+ }
46
+ export function nothingMissing(m) {
47
+ return m.settings.length === 0 && m.memoryMb === null && m.mappings.length === 0;
48
+ }
49
+ /** "mw2-agent wants vGPU and 2 folders (C:\Steam\..., F:\SteamLibrary\...), but this sandbox started without them." */
50
+ export function describeMissing(project, m) {
51
+ const folders = m.mappings.length
52
+ ? [
53
+ m.mappings.length +
54
+ ' folder' +
55
+ (m.mappings.length === 1 ? '' : 's') +
56
+ ' (' +
57
+ m.mappings.map((x) => x.host).join(', ') +
58
+ ')',
59
+ ]
60
+ : [];
61
+ const items = [
62
+ ...m.settings.map((s) => LABELS[s] ?? s),
63
+ ...(m.memoryMb !== null ? [m.memoryMb + ' MB of memory'] : []),
64
+ ...folders,
65
+ ];
66
+ const pronoun = items.length === 1 && !m.mappings.length ? 'it' : 'them';
67
+ return project + ' wants ' + listing(items) + ', but this sandbox started without ' + pronoun + '.';
68
+ }
69
+ /** "Set sandbox.vGpu (or the mappings) in your own settings to have them in every sandbox." */
70
+ export function missingTip(m) {
71
+ const keys = [...m.settings, ...(m.memoryMb !== null ? ['sandbox.memoryMb'] : [])];
72
+ const what = keys.length ? listing(keys) + (m.mappings.length ? ' (or the mappings)' : '') : 'the mappings';
73
+ return 'Set ' + what + ' in your own settings to have them in every sandbox.';
74
+ }
75
+ /**
76
+ * The launch folder's config plus what the other projects mapped at boot want: their allowed .wsb devices, a fixed
77
+ * memory size larger than the launch's, and their mappings (placed with every other mapping at launch).
78
+ * `keepOff`: devices the launch folder's own .sandbox-config.json switched off; they stay off.
79
+ */
80
+ export function widenForProjects(launch, others, opts = {}) {
81
+ const keepOff = opts.keepOff ?? [];
82
+ const exists = opts.exists ?? (() => true);
83
+ const config = _.cloneDeep(launch);
84
+ const widened = {};
85
+ const notes = [];
86
+ for (const setting of BOOT_SETTINGS) {
87
+ const by = others.find((o) => _.get(o.config, setting) === true);
88
+ if (!by || _.get(config, setting) === true)
89
+ continue;
90
+ const label = LABELS[setting] ?? setting;
91
+ if (keepOff.includes(setting)) {
92
+ notes.push(by.name +
93
+ ' wants ' +
94
+ label +
95
+ ", but the launch folder's .sandbox-config.json switches it off, so it stays off.");
96
+ continue;
97
+ }
98
+ _.set(config, setting, true);
99
+ widened[setting] = by.name;
100
+ notes.push(label + ' is on in this sandbox (for every project in it): ' + by.name + ' asks for it and you allowed it.');
101
+ }
102
+ for (const o of others) {
103
+ const mem = o.config.sandbox.memoryMb;
104
+ if (typeof mem === 'number' && typeof config.sandbox.memoryMb === 'number' && mem > config.sandbox.memoryMb)
105
+ config.sandbox.memoryMb = mem;
106
+ for (const m of o.config.mappings) {
107
+ if (config.mappings.some((x) => sameHost(x.host, m.host)))
108
+ continue;
109
+ if (m.optional && !exists(m.host))
110
+ continue;
111
+ if (!exists(m.host)) {
112
+ notes.push(o.name + ': mapped folder not found, skipped: ' + m.host);
113
+ continue;
114
+ }
115
+ // Where it appears (and moving it when that place is taken) is decided with every other mapping at launch.
116
+ config.mappings.push({ ...m, optional: true });
117
+ }
118
+ }
119
+ return { config, widened, notes };
120
+ }
@@ -0,0 +1,3 @@
1
+ import type { LocalConfigFile } from '../types.js';
2
+ export declare const LOCAL_CONFIG_NAME = ".sandbox-config.json";
3
+ export declare const readLocalConfig: (dir: string) => LocalConfigFile | null;
@@ -0,0 +1,16 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import crypto from 'node:crypto';
4
+ import { fileExists, parseJsonc } from '../util/index.js';
5
+ export const LOCAL_CONFIG_NAME = '.sandbox-config.json';
6
+ export const readLocalConfig = (dir) => {
7
+ const file = path.join(dir, LOCAL_CONFIG_NAME);
8
+ if (!fileExists(file))
9
+ return null;
10
+ const raw = fs.readFileSync(file);
11
+ return {
12
+ path: file,
13
+ hash: crypto.createHash('sha256').update(raw).digest('hex'),
14
+ data: parseJsonc(raw.toString('utf8'), file),
15
+ };
16
+ };
@@ -0,0 +1,5 @@
1
+ export { LOCAL_CONFIG_NAME, readLocalConfig } from './file.js';
2
+ export { normalizeOverrides, ON_IS_SAFER, OFF_IS_SAFER, GIT_STRICTNESS, NEVER_LOOSER, loosenedRequests, applyOverrides, describeOverrides, allowRequests, outsideMappings, insideProject, } from './overrides.js';
3
+ export { trustStorePath, isTrusted, saveTrust, allowStorePath, allowedAnswer, saveAllowed, OUTSIDE_FOLDER, outsideKey, } from './trust.js';
4
+ export * from './policy.js';
5
+ export * from './boot-wants.js';
@@ -0,0 +1,7 @@
1
+ // A project's .sandbox-config.json: validated against the LocalOverrides schema (a safe subset of settings), applied
2
+ // over the user config, and only used once you have approved this exact version of the file.
3
+ export { LOCAL_CONFIG_NAME, readLocalConfig } from './file.js';
4
+ export { normalizeOverrides, ON_IS_SAFER, OFF_IS_SAFER, GIT_STRICTNESS, NEVER_LOOSER, loosenedRequests, applyOverrides, describeOverrides, allowRequests, outsideMappings, insideProject, } from './overrides.js';
5
+ export { trustStorePath, isTrusted, saveTrust, allowStorePath, allowedAnswer, saveAllowed, OUTSIDE_FOLDER, outsideKey, } from './trust.js';
6
+ export * from './policy.js';
7
+ export * from './boot-wants.js';
@@ -1,14 +1,13 @@
1
- import type { Config, LocalConfigFile, Overrides } from './types.js';
2
- export declare const LOCAL_CONFIG_NAME = ".sandbox-config.json";
1
+ import type { Config, Overrides } from '../types.js';
3
2
  /** Validates a folder's settings and resolves its relative paths against that folder. */
4
3
  export declare const normalizeOverrides: (data: unknown, dir: string, source: string) => Overrides;
5
4
  /**
6
5
  * The project file's mappings of folders outside the project (%VAR% expanded, links and short names followed). A repo
7
6
  * ships this file, so these reach the rest of this PC: projects.allowOutsideMappings in YOUR settings decides.
8
7
  */
9
- export declare const outsideMappings: <M extends {
8
+ export declare function outsideMappings<M extends {
10
9
  host: string;
11
- }>(dir: string, mappings?: M[]) => M[];
10
+ }>(dir: string, mappings?: readonly M[]): M[];
12
11
  /** `folder` (also where it really is, through links) is inside the project folder `dir`. */
13
12
  export declare const insideProject: (dir: string, folder: string) => boolean;
14
13
  /**
@@ -29,20 +28,6 @@ export declare const loosenedRequests: (config: Config, ov: Overrides) => {
29
28
  export declare const applyOverrides: (config: Config, ov: Overrides) => Config;
30
29
  /** Human-readable list of what a local config changes, with risky items flagged. */
31
30
  export declare const describeOverrides: (ov: Overrides, dir?: string) => string[];
32
- export declare const readLocalConfig: (dir: string) => LocalConfigFile | null;
33
- export declare const trustStorePath: (storageRoot: string) => string;
34
- export declare const isTrusted: (store: string, file: string, hash: string) => boolean;
35
- export declare const saveTrust: (store: string, file: string, hash: string) => void;
36
- export declare const allowStorePath: (storageRoot: string) => string;
37
- /** true = you allowed it, false = you said no (not asked again), null = not asked yet. */
38
- export declare const allowedAnswer: (store: string, file: string, setting: string, value: unknown) => boolean | null;
39
- export declare const saveAllowed: (store: string, file: string, setting: string, value: unknown, allow: boolean) => void;
40
- /** Answers for folders outside the project are kept with the others, one per folder (and read-only or not). */
41
- export declare const OUTSIDE_FOLDER = "folder outside the project";
42
- export declare const outsideKey: (m: {
43
- host: string;
44
- readOnly: boolean;
45
- }) => string;
46
31
  /** Your config with these requests let through, so applyOverrides' "strictest wins" keeps the project's value. */
47
32
  export declare const allowRequests: (config: Config, allowed: {
48
33
  key: string;
@@ -1,17 +1,12 @@
1
- // A project's .sandbox-config.json: validated against the LocalOverrides schema (a safe subset of settings), applied
2
- // over the user config, and only used once you have approved this exact version of the file.
3
1
  import fs from 'node:fs';
4
2
  import path from 'node:path';
5
- import crypto from 'node:crypto';
6
3
  import _ from 'lodash';
7
- import { z } from 'zod';
8
- import { mergeConfig } from './config.js';
9
- import { describeIssues, LocalOverrides } from './schema.js';
10
- import { expandPath, fail, fileExists, isInsideOrEqual, parseJsonc, tryReadJson, writeJson } from './util.js';
11
- export const LOCAL_CONFIG_NAME = '.sandbox-config.json';
4
+ import { mergeConfig } from '../config/index.js';
5
+ import { describeIssues, LocalOverridesSchema } from '../schema/index.js';
6
+ import { expandPath, fail, fileExists, isInsideOrEqual } from '../util/index.js';
12
7
  /** Validates a folder's settings and resolves its relative paths against that folder. */
13
8
  export const normalizeOverrides = (data, dir, source) => {
14
- const parsed = LocalOverrides.safeParse(data);
9
+ const parsed = LocalOverridesSchema.safeParse(data);
15
10
  if (!parsed.success)
16
11
  fail(source + ' is not valid:\n - ' + describeIssues(parsed.error).join('\n - '));
17
12
  const overrides = parsed.data;
@@ -26,10 +21,13 @@ export const normalizeOverrides = (data, dir, source) => {
26
21
  * The project file's mappings of folders outside the project (%VAR% expanded, links and short names followed). A repo
27
22
  * ships this file, so these reach the rest of this PC: projects.allowOutsideMappings in YOUR settings decides.
28
23
  */
29
- export const outsideMappings = (dir, mappings = []) => mappings.filter((m) => !insideProject(dir, m.host));
24
+ export function outsideMappings(dir, mappings = []) {
25
+ return mappings.filter((m) => !insideProject(dir, m.host));
26
+ }
30
27
  /** `folder` (also where it really is, through links) is inside the project folder `dir`. */
31
28
  export const insideProject = (dir, folder) => {
32
- // Where a path really is: the nearest existing folder resolved (links, 8.3 short names), plus the part not created yet.
29
+ // Where a path really is: the nearest existing folder resolved (links, 8.3 short names), plus the part not created
30
+ // yet.
33
31
  const real = (p) => {
34
32
  const full = path.resolve(p);
35
33
  try {
@@ -45,8 +43,25 @@ export const insideProject = (dir, folder) => {
45
43
  * Protections a project file may only make stricter, never looser. A repo can ship the file, so it must not be able to
46
44
  * switch off what you turned on (or turn on what you turned off). The strictest of the two values always wins.
47
45
  */
48
- export const ON_IS_SAFER = ['readOnly', 'workspaceFilter.enabled', 'network.blockPrivateRanges', 'sandbox.protectedClient', 'downloads.requireChecksum'];
49
- export const OFF_IS_SAFER = ['sandbox.networking', 'sandbox.clipboard', 'sandbox.audioInput', 'sandbox.videoInput', 'sandbox.printerRedirection', 'sandbox.vGpu', 'claudeProfile.copyCredentials', 'claudeProfile.enabled', 'claudeProfile.syncHistory', 'claudeProfile.syncClaudeMem'];
46
+ export const ON_IS_SAFER = [
47
+ 'readOnly',
48
+ 'workspaceFilter.enabled',
49
+ 'network.blockPrivateRanges',
50
+ 'sandbox.protectedClient',
51
+ 'downloads.requireChecksum',
52
+ ];
53
+ export const OFF_IS_SAFER = [
54
+ 'sandbox.networking',
55
+ 'sandbox.clipboard',
56
+ 'sandbox.audioInput',
57
+ 'sandbox.videoInput',
58
+ 'sandbox.printerRedirection',
59
+ 'sandbox.vGpu',
60
+ 'claudeProfile.copyCredentials',
61
+ 'claudeProfile.enabled',
62
+ 'claudeProfile.syncHistory',
63
+ 'claudeProfile.syncClaudeMem',
64
+ ];
50
65
  export const GIT_STRICTNESS = { full: 0, readonly: 1, none: 2 };
51
66
  export const NEVER_LOOSER = [...ON_IS_SAFER, ...OFF_IS_SAFER, 'provisioning.git.access'];
52
67
  const keepStrictest = (yours, merged) => {
@@ -59,7 +74,10 @@ const keepStrictest = (yours, merged) => {
59
74
  export const loosenedRequests = (config, ov) => [
60
75
  ...ON_IS_SAFER.filter((p) => _.has(ov, p) && !_.get(ov, p) && _.get(config, p)),
61
76
  ...OFF_IS_SAFER.filter((p) => _.has(ov, p) && _.get(ov, p) && !_.get(config, p)),
62
- ...(_.has(ov, 'provisioning.git.access') && GIT_STRICTNESS[_.get(ov, 'provisioning.git.access')] < GIT_STRICTNESS[config.provisioning.git.access] ? ['provisioning.git.access'] : []),
77
+ ...(_.has(ov, 'provisioning.git.access') &&
78
+ GIT_STRICTNESS[_.get(ov, 'provisioning.git.access')] < GIT_STRICTNESS[config.provisioning.git.access]
79
+ ? ['provisioning.git.access']
80
+ : []),
63
81
  ].map((key) => ({ key, wanted: _.get(ov, key), yours: _.get(config, key) }));
64
82
  /** Applies validated overrides. Mappings with the same guest folder replace the configured ones. */
65
83
  export const applyOverrides = (config, ov) => {
@@ -78,17 +96,27 @@ export const applyOverrides = (config, ov) => {
78
96
  next.workspaceFilter.exclude = _.union(config.workspaceFilter.exclude, rest.workspaceFilter.exclude);
79
97
  const sameGuest = (a, b) => Boolean(a && b && a.toLowerCase() === b.toLowerCase());
80
98
  if (mappings)
81
- next.mappings = [..._.reject(config.mappings, (m) => mappings.some((o) => sameGuest(o.guest, m.guest))), ...mappings];
99
+ next.mappings = [
100
+ ..._.reject(config.mappings, (m) => mappings.some((o) => sameGuest(o.guest, m.guest))),
101
+ ...mappings,
102
+ ];
82
103
  return next;
83
104
  };
84
- const flatten = (value, prefix = '') => _.isPlainObject(value) ? Object.entries(value).flatMap(([k, v]) => flatten(v, prefix ? prefix + '.' + k : k)) : [prefix + ' = ' + JSON.stringify(value)];
105
+ const flatten = (value, prefix = '') => _.isPlainObject(value)
106
+ ? Object.entries(value).flatMap(([k, v]) => flatten(v, prefix ? prefix + '.' + k : k))
107
+ : [prefix + ' = ' + JSON.stringify(value)];
85
108
  /** Human-readable list of what a local config changes, with risky items flagged. */
86
109
  export const describeOverrides = (ov, dir) => {
87
110
  const { harness, mappings = [], scripts = [], $schema: _schema, ...sections } = ov;
88
111
  const outside = dir ? outsideMappings(dir, mappings) : [];
89
112
  const lines = [
90
113
  ...(harness ? ['agent = ' + harness] : []),
91
- ...mappings.map((m) => (m.readOnly ? 'read-only' : 'READ/WRITE') + ' folder ' + m.host + ' -> ' + (m.guest ?? 'the same path') + (outside.includes(m) ? ' (outside the project)' : '')),
114
+ ...mappings.map((m) => (m.readOnly ? 'read-only' : 'READ/WRITE') +
115
+ ' folder ' +
116
+ m.host +
117
+ ' -> ' +
118
+ (m.guest ?? 'the same path') +
119
+ (outside.includes(m) ? ' (outside the project)' : '')),
92
120
  ...scripts.map((s) => 'runs inside the sandbox: ' + s),
93
121
  ...flatten(sections),
94
122
  ];
@@ -99,41 +127,6 @@ export const describeOverrides = (ov, dir) => {
99
127
  const limited = NEVER_LOOSER.filter((p) => _.has(sections, p)).map((p) => p + ' is only used if it is stricter than your own setting');
100
128
  return [...lines, ...risky.map((r) => '!! ' + r), ...limited.map((r) => ' ' + r)];
101
129
  };
102
- export const readLocalConfig = (dir) => {
103
- const file = path.join(dir, LOCAL_CONFIG_NAME);
104
- if (!fileExists(file))
105
- return null;
106
- const raw = fs.readFileSync(file);
107
- return { path: file, hash: crypto.createHash('sha256').update(raw).digest('hex'), data: parseJsonc(raw.toString('utf8'), file) };
108
- };
109
- // ---- approvals (host-only: <storage>\trusted-configs.json) ----------------------------------------------------------
110
- export const trustStorePath = (storageRoot) => path.join(storageRoot, 'trusted-configs.json');
111
- const loadTrust = (store) => tryReadJson(store) ?? {};
112
- const key = (file) => path.resolve(file).toLowerCase();
113
- export const isTrusted = (store, file, hash) => loadTrust(store)[key(file)] === hash;
114
- export const saveTrust = (store, file, hash) => writeJson(store, { ...loadTrust(store), [key(file)]: hash });
115
- // ---- looser settings you allowed for one project (host-only: <storage>\allowed-requests.json) ----------------------
116
- // A project file can never loosen a protection by itself. When it asks, you are asked once (interactively); a "yes"
117
- // is kept here, per project file and per "setting = value", so only that value is ever let through for that project.
118
- export const allowStorePath = (storageRoot) => path.join(storageRoot, 'allowed-requests.json');
119
- const loadAllowed = (store) => {
120
- const parsed = z.record(z.string(), z.array(z.string().max(2000)).max(500)).safeParse(tryReadJson(store) ?? {});
121
- return parsed.success ? parsed.data : {};
122
- };
123
- const allowKey = (setting, value) => setting + ' = ' + JSON.stringify(value);
124
- /** true = you allowed it, false = you said no (not asked again), null = not asked yet. */
125
- export const allowedAnswer = (store, file, setting, value) => {
126
- const answers = loadAllowed(store)[key(file)] ?? [];
127
- return answers.includes(allowKey(setting, value)) ? true : answers.includes('no: ' + allowKey(setting, value)) ? false : null;
128
- };
129
- export const saveAllowed = (store, file, setting, value, allow) => {
130
- const all = loadAllowed(store);
131
- const entry = allowKey(setting, value);
132
- writeJson(store, { ...all, [key(file)]: _.union(_.without(all[key(file)] ?? [], entry, 'no: ' + entry), [(allow ? '' : 'no: ') + entry]) });
133
- };
134
- /** Answers for folders outside the project are kept with the others, one per folder (and read-only or not). */
135
- export const OUTSIDE_FOLDER = 'folder outside the project';
136
- export const outsideKey = (m) => (m.readOnly ? 'read-only ' : 'read/write ') + path.resolve(m.host).toLowerCase();
137
130
  /** Your config with these requests let through, so applyOverrides' "strictest wins" keeps the project's value. */
138
131
  export const allowRequests = (config, allowed) => {
139
132
  const next = _.cloneDeep(config);
@@ -0,0 +1,19 @@
1
+ import type { Config } from '../types.js';
2
+ /** The protections of a running sandbox, by setting path (`sandbox.networking`, `provisioning.git.access`, ...). */
3
+ export type Protections = Record<string, boolean | string>;
4
+ export declare const protectionsOf: (config: Config) => Protections;
5
+ export interface JoinCheck {
6
+ /** Settings this project needs stricter than the running sandbox: the launch is refused. */
7
+ stricter: string[];
8
+ /** Settings it would have looser: it gets the sandbox's (stricter) value; shown as a note. */
9
+ looser: string[];
10
+ /** Settings the sandbox turned on at its start for another project you allowed them for: shared, shown as a note. */
11
+ shared: string[];
12
+ }
13
+ /**
14
+ * Compares a project's effective protections with the running sandbox's. Hub projects are always read/write
15
+ * (Windows Sandbox maps the hub once, read/write), so a read-only project counts as stricter. `widened`: the boot
16
+ * settings the sandbox turned on for another of its projects (with your consent); a project that has them off
17
+ * shares them instead of being refused.
18
+ */
19
+ export declare const checkJoin: (running: Protections, wanted: Protections, widened?: string[]) => JoinCheck;
@@ -0,0 +1,45 @@
1
+ // Joining a running sandbox from another project. Its protections (network, LAN block, git access, clipboard, the
2
+ // .wsb device settings, read-only) are machine-wide: they were fixed when the sandbox booted for the first project.
3
+ // A second project may never loosen them, and a project that needs a STRICTER setting than the running sandbox has
4
+ // cannot get it there without changing it for the sessions already running, so that launch is refused with a clear
5
+ // message. A project asking for less than the sandbox has simply runs with the sandbox's (stricter) setting.
6
+ // Pure: the host checks it before registering a project, the tests drive it directly.
7
+ import _ from 'lodash';
8
+ import { GIT_STRICTNESS, NEVER_LOOSER, OFF_IS_SAFER, ON_IS_SAFER } from './overrides.js';
9
+ export const protectionsOf = (config) => Object.fromEntries(NEVER_LOOSER.map((p) => [p, _.get(config, p)]));
10
+ /** 1 = `wanted` is stricter than `running`, -1 = looser, 0 = the same. */
11
+ const compare = (setting, running, wanted) => {
12
+ if (setting === 'provisioning.git.access')
13
+ return Math.sign((GIT_STRICTNESS[String(wanted)] ?? 0) - (GIT_STRICTNESS[String(running)] ?? 0));
14
+ if (ON_IS_SAFER.includes(setting))
15
+ return Number(Boolean(wanted)) - Number(Boolean(running));
16
+ if (OFF_IS_SAFER.includes(setting))
17
+ return Number(Boolean(running)) - Number(Boolean(wanted));
18
+ return 0;
19
+ };
20
+ /**
21
+ * Compares a project's effective protections with the running sandbox's. Hub projects are always read/write
22
+ * (Windows Sandbox maps the hub once, read/write), so a read-only project counts as stricter. `widened`: the boot
23
+ * settings the sandbox turned on for another of its projects (with your consent); a project that has them off
24
+ * shares them instead of being refused.
25
+ */
26
+ export const checkJoin = (running, wanted, widened = []) => {
27
+ const stricter = [];
28
+ const looser = [];
29
+ const shared = [];
30
+ for (const setting of NEVER_LOOSER) {
31
+ const result = compare(setting, setting === 'readOnly' ? false : running[setting], wanted[setting]);
32
+ if (result > 0 && widened.includes(setting))
33
+ shared.push(setting);
34
+ else if (result > 0)
35
+ stricter.push(setting +
36
+ ' = ' +
37
+ JSON.stringify(wanted[setting]) +
38
+ ' (the running sandbox has ' +
39
+ JSON.stringify(setting === 'readOnly' ? false : running[setting]) +
40
+ ')');
41
+ if (result < 0)
42
+ looser.push(setting + ' stays ' + JSON.stringify(running[setting]));
43
+ }
44
+ return { stricter, looser, shared };
45
+ };
@@ -0,0 +1,13 @@
1
+ export declare const trustStorePath: (storageRoot: string) => string;
2
+ export declare const isTrusted: (store: string, file: string, hash: string) => boolean;
3
+ export declare const saveTrust: (store: string, file: string, hash: string) => void;
4
+ export declare const allowStorePath: (storageRoot: string) => string;
5
+ /** true = you allowed it, false = you said no (not asked again), null = not asked yet. */
6
+ export declare const allowedAnswer: (store: string, file: string, setting: string, value: unknown) => boolean | null;
7
+ export declare const saveAllowed: (store: string, file: string, setting: string, value: unknown, allow: boolean) => void;
8
+ /** Answers for folders outside the project are kept with the others, one per folder (and read-only or not). */
9
+ export declare const OUTSIDE_FOLDER = "folder outside the project";
10
+ export declare function outsideKey(m: {
11
+ host: string;
12
+ readOnly: boolean;
13
+ }): string;