windows-development-sandbox 1.4.0 → 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 (877) hide show
  1. package/.sandbox-config.example.json +2 -1
  2. package/config.example.json +4 -1
  3. package/dist/api.js +27 -16
  4. package/dist/cli/args.d.ts +4 -6
  5. package/dist/cli/args.js +67 -34
  6. package/dist/cli/argv.d.ts +9 -0
  7. package/dist/cli/argv.js +22 -0
  8. package/dist/cli/commands/accounts.d.ts +1 -1
  9. package/dist/cli/commands/accounts.js +42 -27
  10. package/dist/cli/commands/agent-commands.d.ts +3 -3
  11. package/dist/cli/commands/agent-commands.js +27 -18
  12. package/dist/cli/commands/context.d.ts +9 -11
  13. package/dist/cli/commands/context.js +35 -32
  14. package/dist/cli/commands/data/clean.d.ts +2 -2
  15. package/dist/cli/commands/data/clean.js +27 -11
  16. package/dist/cli/commands/data/collect.d.ts +6 -3
  17. package/dist/cli/commands/data/collect.js +46 -15
  18. package/dist/cli/commands/data/index.d.ts +2 -2
  19. package/dist/cli/commands/data/index.js +30 -12
  20. package/dist/cli/commands/data/remove.d.ts +1 -1
  21. package/dist/cli/commands/data/remove.js +4 -4
  22. package/dist/cli/commands/index.d.ts +5 -4
  23. package/dist/cli/commands/index.js +5 -4
  24. package/dist/cli/commands/launch/add-root.d.ts +7 -0
  25. package/dist/cli/commands/launch/add-root.js +64 -0
  26. package/dist/cli/commands/launch/boot-progress.d.ts +7 -0
  27. package/dist/cli/commands/launch/boot-progress.js +48 -0
  28. package/dist/cli/commands/launch/boot-wants.d.ts +11 -0
  29. package/dist/cli/commands/launch/boot-wants.js +48 -0
  30. package/dist/cli/commands/launch/first-start.d.ts +10 -0
  31. package/dist/cli/commands/launch/first-start.js +53 -0
  32. package/dist/cli/commands/launch/index.d.ts +6 -0
  33. package/dist/cli/commands/launch/index.js +6 -0
  34. package/dist/cli/commands/launch/launch.d.ts +8 -0
  35. package/dist/cli/commands/launch/launch.js +211 -0
  36. package/dist/cli/commands/launch/prepare.d.ts +23 -0
  37. package/dist/cli/commands/launch/prepare.js +109 -0
  38. package/dist/cli/commands/launch/running.d.ts +45 -0
  39. package/dist/cli/commands/launch/running.js +218 -0
  40. package/dist/cli/commands/launch/summary.d.ts +8 -0
  41. package/dist/cli/commands/launch/summary.js +98 -0
  42. package/dist/cli/commands/maintenance/audit.d.ts +3 -0
  43. package/dist/cli/commands/maintenance/audit.js +58 -0
  44. package/dist/cli/commands/maintenance/clean.d.ts +2 -0
  45. package/dist/cli/commands/maintenance/clean.js +10 -0
  46. package/dist/cli/commands/maintenance/config.d.ts +2 -0
  47. package/dist/cli/commands/maintenance/config.js +145 -0
  48. package/dist/cli/commands/maintenance/doctor.d.ts +2 -0
  49. package/dist/cli/commands/maintenance/doctor.js +52 -0
  50. package/dist/cli/commands/maintenance/host-claude.d.ts +2 -0
  51. package/dist/cli/commands/maintenance/host-claude.js +4 -0
  52. package/dist/cli/commands/maintenance/index.d.ts +8 -0
  53. package/dist/cli/commands/maintenance/index.js +9 -0
  54. package/dist/cli/commands/maintenance/logs.d.ts +2 -0
  55. package/dist/cli/commands/maintenance/logs.js +44 -0
  56. package/dist/cli/commands/maintenance/sync.d.ts +2 -0
  57. package/dist/cli/commands/maintenance/sync.js +12 -0
  58. package/dist/cli/commands/maintenance/watch.d.ts +3 -0
  59. package/dist/cli/commands/maintenance/watch.js +6 -0
  60. package/dist/cli/commands/projects/describe-sessions.d.ts +3 -0
  61. package/dist/cli/commands/projects/describe-sessions.js +15 -0
  62. package/dist/cli/commands/projects/here.d.ts +38 -0
  63. package/dist/cli/commands/projects/here.js +145 -0
  64. package/dist/cli/commands/projects/index.d.ts +4 -0
  65. package/dist/cli/commands/projects/index.js +4 -0
  66. package/dist/cli/commands/projects/projects.d.ts +14 -0
  67. package/dist/cli/commands/projects/projects.js +213 -0
  68. package/dist/cli/commands/projects/restart.d.ts +15 -0
  69. package/dist/cli/commands/projects/restart.js +149 -0
  70. package/dist/cli/commands/registry.d.ts +3 -0
  71. package/dist/cli/commands/registry.js +34 -0
  72. package/dist/cli/commands/repair/checks.js +105 -29
  73. package/dist/cli/commands/repair/finders.d.ts +13 -10
  74. package/dist/cli/commands/repair/finders.js +63 -43
  75. package/dist/cli/commands/repair/index.d.ts +4 -4
  76. package/dist/cli/commands/repair/index.js +47 -21
  77. package/dist/cli/commands/repair/types.d.ts +2 -2
  78. package/dist/cli/commands/repair/types.js +7 -2
  79. package/dist/cli/commands/sessions/attach.d.ts +2 -0
  80. package/dist/cli/commands/sessions/attach.js +45 -0
  81. package/dist/cli/commands/sessions/control.d.ts +4 -0
  82. package/dist/cli/commands/sessions/control.js +62 -0
  83. package/dist/cli/commands/sessions/exec.d.ts +6 -0
  84. package/dist/cli/commands/sessions/exec.js +72 -0
  85. package/dist/cli/commands/sessions/index.d.ts +6 -0
  86. package/dist/cli/commands/sessions/index.js +9 -0
  87. package/dist/cli/commands/sessions/list.d.ts +15 -0
  88. package/dist/cli/commands/sessions/list.js +65 -0
  89. package/dist/cli/commands/sessions/status.d.ts +2 -0
  90. package/dist/cli/commands/sessions/status.js +153 -0
  91. package/dist/cli/commands/sessions/window.d.ts +3 -0
  92. package/dist/cli/commands/sessions/window.js +18 -0
  93. package/dist/cli/commands/setup/checks.d.ts +4 -4
  94. package/dist/cli/commands/setup/checks.js +36 -19
  95. package/dist/cli/commands/setup/facts.d.ts +6 -6
  96. package/dist/cli/commands/setup/facts.js +23 -11
  97. package/dist/cli/commands/setup/index.d.ts +1 -1
  98. package/dist/cli/commands/setup/index.js +25 -12
  99. package/dist/cli/commands/user-config.d.ts +5 -5
  100. package/dist/cli/commands/user-config.js +14 -12
  101. package/dist/cli/history.d.ts +5 -4
  102. package/dist/cli/history.js +23 -11
  103. package/dist/cli/index.d.ts +4 -14
  104. package/dist/cli/index.js +27 -77
  105. package/dist/cli/manifest.d.ts +464 -10
  106. package/dist/cli/manifest.js +328 -54
  107. package/dist/cli/menu/apps.d.ts +7 -5
  108. package/dist/cli/menu/apps.js +64 -16
  109. package/dist/cli/menu/command-fields.d.ts +15 -0
  110. package/dist/cli/menu/command-fields.js +23 -0
  111. package/dist/cli/menu/command-form.d.ts +3 -5
  112. package/dist/cli/menu/command-form.js +116 -48
  113. package/dist/cli/menu/home.d.ts +22 -0
  114. package/dist/cli/menu/home.js +72 -0
  115. package/dist/cli/menu/index.d.ts +2 -24
  116. package/dist/cli/menu/index.js +4 -178
  117. package/dist/cli/menu/menu.d.ts +23 -0
  118. package/dist/cli/menu/menu.js +185 -0
  119. package/dist/cli/menu/settings/categories.d.ts +2 -2
  120. package/dist/cli/menu/settings/categories.js +123 -20
  121. package/dist/cli/menu/settings/collections/collection-editor.d.ts +23 -0
  122. package/dist/cli/menu/settings/collections/collection-editor.js +89 -0
  123. package/dist/cli/menu/settings/collections/map-editor.d.ts +10 -0
  124. package/dist/cli/menu/settings/collections/map-editor.js +34 -0
  125. package/dist/cli/menu/settings/collections/object-list-editor.d.ts +10 -0
  126. package/dist/cli/menu/settings/collections/object-list-editor.js +23 -0
  127. package/dist/cli/menu/settings/collections/object-map-editor.d.ts +10 -0
  128. package/dist/cli/menu/settings/collections/object-map-editor.js +35 -0
  129. package/dist/cli/menu/settings/collections/string-list-editor.d.ts +12 -0
  130. package/dist/cli/menu/settings/collections/string-list-editor.js +39 -0
  131. package/dist/cli/menu/settings/config-file.d.ts +2 -2
  132. package/dist/cli/menu/settings/config-file.js +42 -19
  133. package/dist/cli/menu/settings/editor-actions.d.ts +2 -0
  134. package/dist/cli/menu/settings/editor-actions.js +2 -0
  135. package/dist/cli/menu/settings/format.d.ts +5 -0
  136. package/dist/cli/menu/settings/format.js +39 -0
  137. package/dist/cli/menu/settings/index.d.ts +1 -29
  138. package/dist/cli/menu/settings/index.js +1 -133
  139. package/dist/cli/menu/settings/object-editor.d.ts +12 -0
  140. package/dist/cli/menu/settings/object-editor.js +86 -0
  141. package/dist/cli/menu/settings/schema-node.d.ts +3 -1
  142. package/dist/cli/menu/settings/schema-node.js +71 -24
  143. package/dist/cli/menu/settings/settings-editor.d.ts +30 -0
  144. package/dist/cli/menu/settings/settings-editor.js +176 -0
  145. package/dist/cli/menu/settings/{editors.d.ts → value-editor.d.ts} +2 -13
  146. package/dist/cli/menu/settings/value-editor.js +137 -0
  147. package/dist/cli/menu/several.d.ts +4 -4
  148. package/dist/cli/menu/several.js +61 -20
  149. package/dist/cli/{colors.d.ts → output/colors.d.ts} +8 -8
  150. package/dist/cli/{colors.js → output/colors.js} +32 -14
  151. package/dist/cli/output/index.d.ts +3 -0
  152. package/dist/cli/output/index.js +3 -0
  153. package/dist/cli/output/print.d.ts +5 -0
  154. package/dist/cli/output/print.js +14 -0
  155. package/dist/cli/output/progress.d.ts +24 -0
  156. package/dist/cli/output/progress.js +124 -0
  157. package/dist/cli/report.d.ts +2 -0
  158. package/dist/cli/report.js +20 -0
  159. package/dist/cli/tui/app.d.ts +6 -16
  160. package/dist/cli/tui/app.js +28 -8
  161. package/dist/cli/tui/dialogs/confirm-screen.d.ts +20 -0
  162. package/dist/cli/tui/dialogs/confirm-screen.js +50 -0
  163. package/dist/cli/tui/dialogs/message-screen.d.ts +17 -0
  164. package/dist/cli/tui/dialogs/message-screen.js +55 -0
  165. package/dist/cli/tui/dialogs/paragraphs.d.ts +2 -0
  166. package/dist/cli/tui/dialogs/paragraphs.js +5 -0
  167. package/dist/cli/tui/dialogs/text-screen.d.ts +26 -0
  168. package/dist/cli/tui/dialogs/text-screen.js +107 -0
  169. package/dist/cli/tui/frame.js +3 -1
  170. package/dist/cli/tui/index.d.ts +7 -3
  171. package/dist/cli/tui/index.js +4 -2
  172. package/dist/cli/tui/list/list-screen.d.ts +29 -0
  173. package/dist/cli/tui/{list-screen.js → list/list-screen.js} +86 -23
  174. package/dist/cli/tui/{list-screen.d.ts → list/list-types.d.ts} +0 -28
  175. package/dist/cli/tui/screen.d.ts +14 -0
  176. package/dist/cli/tui/terminal.js +34 -10
  177. package/dist/cli/tui/text.d.ts +2 -1
  178. package/dist/cli/tui/text.js +37 -7
  179. package/dist/cli/tui/theme.js +27 -9
  180. package/dist/cli/validate.d.ts +8 -8
  181. package/dist/cli/validate.js +32 -21
  182. package/dist/core/config/defaults.d.ts +2 -0
  183. package/dist/core/config/defaults.js +203 -0
  184. package/dist/core/config/index.d.ts +2 -0
  185. package/dist/core/config/index.js +3 -0
  186. package/dist/core/{config.d.ts → config/loader.d.ts} +1 -2
  187. package/dist/core/config/loader.js +47 -0
  188. package/dist/core/{detect-databases.js → detect/databases.js} +111 -23
  189. package/dist/core/detect/index.d.ts +4 -0
  190. package/dist/core/detect/index.js +4 -0
  191. package/dist/core/{detect-pwsh.d.ts → detect/pwsh.d.ts} +1 -1
  192. package/dist/core/{detect-pwsh.js → detect/pwsh.js} +25 -11
  193. package/dist/core/{detect-toolchains.d.ts → detect/toolchains.d.ts} +1 -1
  194. package/dist/core/{detect-toolchains.js → detect/toolchains.js} +42 -5
  195. package/dist/{guest/toolchains → core/detect}/versions.js +28 -12
  196. package/dist/core/disk.d.ts +2 -0
  197. package/dist/core/disk.js +46 -3
  198. package/dist/core/local-config/boot-wants.d.ts +45 -0
  199. package/dist/core/local-config/boot-wants.js +120 -0
  200. package/dist/core/local-config/file.d.ts +3 -0
  201. package/dist/core/local-config/file.js +16 -0
  202. package/dist/core/local-config/index.d.ts +5 -0
  203. package/dist/core/local-config/index.js +7 -0
  204. package/dist/core/{local-config.d.ts → local-config/overrides.d.ts} +11 -11
  205. package/dist/core/{local-config.js → local-config/overrides.js} +53 -54
  206. package/dist/core/{project-policy.d.ts → local-config/policy.d.ts} +7 -3
  207. package/dist/core/{project-policy.js → local-config/policy.js} +16 -6
  208. package/dist/core/local-config/trust.d.ts +13 -0
  209. package/dist/core/local-config/trust.js +43 -0
  210. package/dist/core/package-info.d.ts +4 -0
  211. package/dist/core/package-info.js +13 -0
  212. package/dist/core/run/guest-workspace.d.ts +23 -0
  213. package/dist/core/run/guest-workspace.js +47 -0
  214. package/dist/core/run/index.d.ts +3 -0
  215. package/dist/core/run/index.js +3 -0
  216. package/dist/core/run/resolve-run.d.ts +3 -0
  217. package/dist/core/run/resolve-run.js +202 -0
  218. package/dist/core/run/versions.d.ts +13 -0
  219. package/dist/core/run/versions.js +65 -0
  220. package/dist/core/safe-paths.js +17 -5
  221. package/dist/core/schema/apps.d.ts +4 -4
  222. package/dist/core/schema/apps.js +55 -21
  223. package/dist/core/schema/common.d.ts +13 -10
  224. package/dist/core/schema/common.js +16 -10
  225. package/dist/core/schema/config.d.ts +18 -12
  226. package/dist/core/schema/config.js +78 -53
  227. package/dist/core/schema/databases.d.ts +4 -3
  228. package/dist/core/schema/databases.js +16 -12
  229. package/dist/core/schema/harness.d.ts +1 -1
  230. package/dist/core/schema/harness.js +17 -7
  231. package/dist/core/schema/index.d.ts +6 -0
  232. package/dist/core/schema/index.js +8 -0
  233. package/dist/core/schema/json-schema.js +10 -5
  234. package/dist/core/schema/profile.d.ts +4 -4
  235. package/dist/core/schema/profile.js +37 -17
  236. package/dist/core/schema/projects.d.ts +2 -1
  237. package/dist/core/schema/projects.js +16 -5
  238. package/dist/core/schema/sandbox.d.ts +12 -12
  239. package/dist/core/schema/sandbox.js +101 -37
  240. package/dist/core/schema/toolchains.d.ts +6 -1
  241. package/dist/core/schema/toolchains.js +84 -34
  242. package/dist/core/types.d.ts +36 -9
  243. package/dist/core/util/errors.d.ts +8 -0
  244. package/dist/core/util/errors.js +14 -0
  245. package/dist/core/util/fs.d.ts +8 -0
  246. package/dist/core/util/fs.js +40 -0
  247. package/dist/core/util/index.d.ts +7 -0
  248. package/dist/core/util/index.js +7 -0
  249. package/dist/core/util/jsonc.d.ts +6 -0
  250. package/dist/core/util/jsonc.js +25 -0
  251. package/dist/core/util/links.d.ts +10 -0
  252. package/dist/core/util/links.js +39 -0
  253. package/dist/core/util/paths.d.ts +7 -0
  254. package/dist/core/util/paths.js +33 -0
  255. package/dist/core/util/process.d.ts +15 -0
  256. package/dist/core/util/process.js +54 -0
  257. package/dist/core/util/text.d.ts +8 -0
  258. package/dist/core/util/text.js +8 -0
  259. package/dist/guest/{setup/agents.js → agents/agent-installer.js} +24 -4
  260. package/dist/guest/apps/after-install.d.ts +3 -0
  261. package/dist/guest/apps/after-install.js +47 -0
  262. package/dist/guest/apps/app-installer.d.ts +22 -0
  263. package/dist/guest/apps/app-installer.js +116 -0
  264. package/dist/guest/apps/find-exe.d.ts +5 -0
  265. package/dist/guest/apps/find-exe.js +41 -0
  266. package/dist/guest/apps/index.d.ts +3 -10
  267. package/dist/guest/apps/index.js +6 -206
  268. package/dist/guest/apps/resolvers.js +37 -9
  269. package/dist/guest/apps/shortcuts.d.ts +6 -0
  270. package/dist/guest/apps/shortcuts.js +28 -0
  271. package/dist/guest/apps/sources.d.ts +4 -0
  272. package/dist/guest/apps/sources.js +17 -0
  273. package/dist/guest/apps/unpack.d.ts +3 -0
  274. package/dist/guest/apps/unpack.js +47 -0
  275. package/dist/guest/{audit-parse.js → audit/parse.js} +39 -3
  276. package/dist/guest/{audit.d.ts → audit/process-audit.d.ts} +3 -1
  277. package/dist/guest/{audit.js → audit/process-audit.js} +33 -8
  278. package/dist/guest/boot/boot-env.d.ts +4 -0
  279. package/dist/guest/{boot-env.js → boot/boot-env.js} +7 -5
  280. package/dist/guest/boot/boot.d.ts +1 -0
  281. package/dist/guest/{main.js → boot/boot.js} +100 -50
  282. package/dist/guest/{guide.js → boot/guide.js} +32 -7
  283. package/dist/guest/{project-env.d.ts → boot/project-env.d.ts} +3 -3
  284. package/dist/guest/{project-env.js → boot/project-env.js} +12 -4
  285. package/dist/guest/boot/project-status.d.ts +5 -0
  286. package/dist/guest/boot/project-status.js +28 -0
  287. package/dist/guest/daemon/daemon.d.ts +1 -0
  288. package/dist/guest/daemon/daemon.js +51 -0
  289. package/dist/guest/daemon/exec.js +18 -6
  290. package/dist/guest/daemon/{shutdown.js → idle-shutdown.js} +5 -4
  291. package/dist/guest/daemon/{project.d.ts → project-provisioner.d.ts} +3 -3
  292. package/dist/guest/daemon/{project.js → project-provisioner.js} +60 -22
  293. package/dist/guest/daemon/relays.js +5 -3
  294. package/dist/guest/daemon/{session.js → sessions.js} +84 -24
  295. package/dist/guest/daemon/state.d.ts +4 -1
  296. package/dist/guest/daemon/state.js +34 -20
  297. package/dist/guest/databases/database-server.d.ts +13 -0
  298. package/dist/guest/databases/database-server.js +35 -0
  299. package/dist/guest/databases/dynamodb.d.ts +12 -0
  300. package/dist/guest/databases/dynamodb.js +81 -0
  301. package/dist/guest/databases/index.d.ts +2 -0
  302. package/dist/guest/databases/index.js +2 -0
  303. package/dist/guest/databases/mongodb.d.ts +7 -0
  304. package/dist/guest/databases/mongodb.js +46 -0
  305. package/dist/guest/databases/mysql.d.ts +7 -0
  306. package/dist/guest/databases/mysql.js +59 -0
  307. package/dist/guest/databases/names.d.ts +5 -0
  308. package/dist/guest/databases/names.js +8 -0
  309. package/dist/guest/databases/postgres.d.ts +9 -0
  310. package/dist/guest/databases/postgres.js +85 -0
  311. package/dist/guest/databases/redis.d.ts +7 -0
  312. package/dist/guest/databases/redis.js +25 -0
  313. package/dist/guest/databases/registry.d.ts +5 -0
  314. package/dist/guest/databases/registry.js +51 -0
  315. package/dist/guest/databases/sbx-db.d.ts +1 -0
  316. package/dist/guest/{db.js → databases/sbx-db.js} +13 -13
  317. package/dist/guest/{toolchains/databases → databases}/server.d.ts +5 -5
  318. package/dist/guest/{toolchains/databases → databases}/server.js +18 -13
  319. package/dist/guest/entries/daemon.js +16 -0
  320. package/dist/guest/entries/db.js +10 -0
  321. package/dist/guest/entries/gitguard.js +20 -0
  322. package/dist/guest/entries/main.d.ts +1 -0
  323. package/dist/guest/entries/main.js +24 -0
  324. package/dist/guest/entries/netproxy.d.ts +1 -0
  325. package/dist/guest/entries/netproxy.js +7 -0
  326. package/dist/guest/entries/view.d.ts +1 -0
  327. package/dist/guest/entries/view.js +11 -0
  328. package/dist/guest/{gitguard.js → git/decision.js} +49 -26
  329. package/dist/guest/network/addresses.d.ts +2 -0
  330. package/dist/guest/network/addresses.js +6 -0
  331. package/dist/guest/{setup/network.d.ts → network/allow-only.d.ts} +0 -10
  332. package/dist/guest/network/allow-only.js +84 -0
  333. package/dist/guest/network/firewall.d.ts +9 -0
  334. package/dist/guest/{setup/network.js → network/firewall.js} +58 -63
  335. package/dist/guest/network/proxy-server.d.ts +2 -0
  336. package/dist/guest/{netproxy.js → network/proxy-server.js} +37 -18
  337. package/dist/guest/{helpers.d.ts → runtime/csc.d.ts} +1 -1
  338. package/dist/guest/{helpers.js → runtime/csc.js} +7 -2
  339. package/dist/guest/runtime/fs.d.ts +2 -0
  340. package/dist/guest/runtime/fs.js +6 -0
  341. package/dist/guest/runtime/log.d.ts +3 -0
  342. package/dist/guest/runtime/log.js +22 -0
  343. package/dist/guest/runtime/paths.d.ts +13 -0
  344. package/dist/guest/runtime/paths.js +14 -0
  345. package/dist/guest/{ports.js → runtime/ports.js} +8 -2
  346. package/dist/guest/runtime/process.d.ts +15 -0
  347. package/dist/guest/runtime/process.js +59 -0
  348. package/dist/guest/{project-context.js → runtime/project-context.js} +1 -1
  349. package/dist/guest/runtime/session.d.ts +5 -0
  350. package/dist/guest/runtime/session.js +10 -0
  351. package/dist/guest/runtime/status.d.ts +7 -0
  352. package/dist/guest/runtime/status.js +57 -0
  353. package/dist/guest/{cmdline.js → sessions/cmdline.js} +10 -4
  354. package/dist/guest/{ptyhost.js → sessions/pty-host.js} +12 -5
  355. package/dist/guest/{view.js → sessions/viewer.js} +8 -11
  356. package/dist/guest/setup/claude-mem.d.ts +10 -0
  357. package/dist/guest/setup/{claude.js → claude-mem.js} +18 -78
  358. package/dist/guest/setup/{claude.d.ts → claude-profile.d.ts} +0 -10
  359. package/dist/guest/setup/claude-profile.js +89 -0
  360. package/dist/guest/setup/desktop.d.ts +2 -0
  361. package/dist/guest/setup/desktop.js +32 -0
  362. package/dist/guest/setup/environment.js +28 -5
  363. package/dist/guest/setup/{user.d.ts → git-identity.d.ts} +0 -2
  364. package/dist/guest/setup/git-identity.js +34 -0
  365. package/dist/guest/{gitrules.d.ts → setup/git-rules.d.ts} +1 -1
  366. package/dist/guest/setup/git-rules.js +50 -0
  367. package/dist/guest/setup/hooks.js +22 -5
  368. package/dist/guest/setup/{policy.js → managed-policy.js} +2 -2
  369. package/dist/guest/toolchains/catalogue.d.ts +4 -4
  370. package/dist/guest/toolchains/catalogue.js +30 -7
  371. package/dist/guest/toolchains/detect.d.ts +12 -0
  372. package/dist/guest/toolchains/detect.js +54 -0
  373. package/dist/guest/toolchains/index.d.ts +3 -17
  374. package/dist/guest/toolchains/index.js +1 -80
  375. package/dist/guest/toolchains/install.d.ts +20 -0
  376. package/dist/guest/toolchains/install.js +29 -0
  377. package/dist/guest/toolchains/languages/go.d.ts +3 -0
  378. package/dist/guest/toolchains/{go.js → languages/go.js} +27 -9
  379. package/dist/guest/toolchains/languages/java.d.ts +8 -0
  380. package/dist/guest/toolchains/{java.js → languages/java.js} +57 -18
  381. package/dist/guest/toolchains/languages/node.d.ts +3 -0
  382. package/dist/guest/toolchains/{node.js → languages/node.js} +51 -18
  383. package/dist/guest/toolchains/languages/php.d.ts +3 -0
  384. package/dist/guest/toolchains/{scripting → languages}/php.js +36 -11
  385. package/dist/guest/toolchains/languages/python-tools.d.ts +3 -0
  386. package/dist/guest/toolchains/languages/python-tools.js +12 -0
  387. package/dist/guest/toolchains/languages/python.d.ts +3 -0
  388. package/dist/guest/toolchains/{python.js → languages/python.js} +29 -16
  389. package/dist/guest/toolchains/languages/ruby.d.ts +3 -0
  390. package/dist/guest/toolchains/{scripting → languages}/ruby.js +28 -10
  391. package/dist/guest/toolchains/leftovers.d.ts +1 -1
  392. package/dist/guest/toolchains/leftovers.js +13 -11
  393. package/dist/guest/toolchains/managers.d.ts +6 -6
  394. package/dist/guest/toolchains/managers.js +38 -17
  395. package/dist/guest/toolchains/native/binstall.d.ts +3 -2
  396. package/dist/guest/toolchains/native/binstall.js +20 -8
  397. package/dist/guest/toolchains/native/cpp.d.ts +2 -2
  398. package/dist/guest/toolchains/native/cpp.js +23 -8
  399. package/dist/guest/toolchains/native/dotnet.d.ts +5 -3
  400. package/dist/guest/toolchains/native/dotnet.js +72 -24
  401. package/dist/guest/toolchains/native/mesa.d.ts +2 -2
  402. package/dist/guest/toolchains/native/mesa.js +27 -10
  403. package/dist/guest/toolchains/native/msvc/environment.d.ts +4 -4
  404. package/dist/guest/toolchains/native/msvc/environment.js +30 -16
  405. package/dist/guest/toolchains/native/msvc/index.d.ts +3 -3
  406. package/dist/guest/toolchains/native/msvc/index.js +10 -8
  407. package/dist/guest/toolchains/native/msvc/packages.d.ts +1 -1
  408. package/dist/guest/toolchains/native/msvc/packages.js +69 -23
  409. package/dist/guest/toolchains/native/msvc/tree.d.ts +6 -6
  410. package/dist/guest/toolchains/native/msvc/tree.js +15 -9
  411. package/dist/guest/toolchains/native/rust-extras.d.ts +23 -0
  412. package/dist/guest/toolchains/native/rust-extras.js +100 -0
  413. package/dist/guest/toolchains/native/rust.d.ts +2 -2
  414. package/dist/guest/toolchains/native/rust.js +41 -10
  415. package/dist/guest/toolchains/{scripting → native}/vcruntime.d.ts +2 -2
  416. package/dist/guest/toolchains/{scripting → native}/vcruntime.js +17 -7
  417. package/dist/guest/toolchains/package-ledger.d.ts +17 -0
  418. package/dist/guest/toolchains/package-ledger.js +54 -0
  419. package/dist/guest/toolchains/plan.d.ts +3 -24
  420. package/dist/guest/toolchains/plan.js +99 -111
  421. package/dist/guest/toolchains/runtimes.d.ts +6 -6
  422. package/dist/guest/toolchains/runtimes.js +31 -13
  423. package/dist/guest/toolchains/scheduler.d.ts +22 -0
  424. package/dist/guest/toolchains/scheduler.js +123 -0
  425. package/dist/guest/toolchains/setup.d.ts +10 -0
  426. package/dist/guest/toolchains/setup.js +22 -0
  427. package/dist/guest/toolchains/state-file.d.ts +3 -0
  428. package/dist/guest/toolchains/state-file.js +10 -0
  429. package/dist/guest/toolchains/step.d.ts +24 -0
  430. package/dist/guest/toolchains/step.js +1 -0
  431. package/dist/guest/toolchains/tool-env.d.ts +12 -0
  432. package/dist/guest/toolchains/tool-env.js +16 -0
  433. package/dist/guest/toolchains/tools/cli.d.ts +10 -0
  434. package/dist/guest/toolchains/{cli.js → tools/cli.js} +35 -15
  435. package/dist/guest/toolchains/tools/git.d.ts +3 -0
  436. package/dist/guest/toolchains/{git.js → tools/git.js} +38 -15
  437. package/dist/guest/toolchains/tools/pwsh.d.ts +4 -0
  438. package/dist/guest/toolchains/{pwsh.js → tools/pwsh.js} +14 -7
  439. package/dist/guest/toolchains/{vscode-profile.d.ts → tools/vscode-profile.d.ts} +6 -6
  440. package/dist/guest/toolchains/{vscode-profile.js → tools/vscode-profile.js} +28 -12
  441. package/dist/guest/toolchains/{vscode.d.ts → tools/vscode.d.ts} +6 -6
  442. package/dist/guest/toolchains/{vscode.js → tools/vscode.js} +67 -21
  443. package/dist/guest/toolchains/version-cache.d.ts +16 -0
  444. package/dist/guest/toolchains/version-cache.js +67 -0
  445. package/dist/host/agent-commands/commands.d.ts +13 -0
  446. package/dist/host/agent-commands/commands.js +33 -0
  447. package/dist/host/agent-commands/forwarders.d.ts +7 -0
  448. package/dist/host/agent-commands/forwarders.js +31 -0
  449. package/dist/host/agent-commands/index.d.ts +4 -0
  450. package/dist/host/agent-commands/index.js +4 -0
  451. package/dist/host/agent-commands/reconcile.d.ts +12 -0
  452. package/dist/host/agent-commands/reconcile.js +69 -0
  453. package/dist/host/agent-commands/user-path.d.ts +2 -0
  454. package/dist/host/agent-commands/user-path.js +33 -0
  455. package/dist/host/audit/collect.d.ts +2 -2
  456. package/dist/host/audit/collect.js +59 -22
  457. package/dist/host/audit/log.d.ts +2 -2
  458. package/dist/host/audit/log.js +24 -8
  459. package/dist/host/{attach.d.ts → channel/attach.d.ts} +2 -2
  460. package/dist/host/{attach.js → channel/attach.js} +33 -15
  461. package/dist/host/channel/channel.d.ts +51 -0
  462. package/dist/host/channel/channel.js +196 -0
  463. package/dist/host/channel/index.d.ts +2 -0
  464. package/dist/host/channel/index.js +2 -0
  465. package/dist/host/guard/agent-files.d.ts +7 -0
  466. package/dist/host/guard/agent-files.js +103 -0
  467. package/dist/host/guard/commands.d.ts +10 -0
  468. package/dist/host/guard/commands.js +123 -0
  469. package/dist/host/guard/file-hash.d.ts +4 -0
  470. package/dist/host/guard/file-hash.js +37 -0
  471. package/dist/host/guard/git-config.d.ts +5 -0
  472. package/dist/host/guard/git-config.js +62 -0
  473. package/dist/host/guard/git-dirs.d.ts +12 -0
  474. package/dist/host/guard/git-dirs.js +53 -0
  475. package/dist/host/guard/index.d.ts +5 -0
  476. package/dist/host/guard/index.js +4 -0
  477. package/dist/host/guard/mark-of-the-web.d.ts +8 -0
  478. package/dist/host/guard/mark-of-the-web.js +74 -0
  479. package/dist/host/guard/nested-repos.d.ts +14 -0
  480. package/dist/host/guard/nested-repos.js +88 -0
  481. package/dist/host/guard/quarantine.d.ts +3 -0
  482. package/dist/host/guard/quarantine.js +24 -0
  483. package/dist/host/guard/repo-guard.d.ts +10 -0
  484. package/dist/host/guard/repo-guard.js +36 -0
  485. package/dist/host/guard/store.d.ts +40 -0
  486. package/dist/host/guard/store.js +145 -0
  487. package/dist/host/guard/types.d.ts +27 -0
  488. package/dist/host/guard/types.js +3 -0
  489. package/dist/host/guard/watch-state.d.ts +9 -0
  490. package/dist/host/guard/watch-state.js +26 -0
  491. package/dist/host/launch/boot-projects.d.ts +17 -0
  492. package/dist/host/launch/{projects.js → boot-projects.js} +27 -12
  493. package/dist/host/{database-plan.d.ts → launch/database-plan.d.ts} +5 -5
  494. package/dist/host/{database-plan.js → launch/database-plan.js} +24 -13
  495. package/dist/host/launch/generate.d.ts +4 -0
  496. package/dist/host/launch/generate.js +77 -0
  497. package/dist/host/launch/index.d.ts +10 -0
  498. package/dist/host/launch/index.js +10 -0
  499. package/dist/host/launch/mappings.d.ts +7 -2
  500. package/dist/host/launch/mappings.js +83 -24
  501. package/dist/host/launch/pc-scan.d.ts +5 -0
  502. package/dist/host/{pc-scan.js → launch/pc-scan.js} +20 -13
  503. package/dist/host/launch/project-scan.d.ts +7 -0
  504. package/dist/host/{project-scan.js → launch/project-scan.js} +29 -21
  505. package/dist/host/launch/session-file.d.ts +23 -0
  506. package/dist/host/launch/session-file.js +73 -0
  507. package/dist/host/launch/stage.d.ts +5 -5
  508. package/dist/host/launch/stage.js +14 -13
  509. package/dist/host/launch/toolchains.d.ts +4 -0
  510. package/dist/host/launch/toolchains.js +11 -0
  511. package/dist/host/launch/{wsb.d.ts → wsb-file.d.ts} +4 -2
  512. package/dist/host/launch/wsb-file.js +56 -0
  513. package/dist/host/life/crash-report.d.ts +8 -0
  514. package/dist/host/life/crash-report.js +87 -0
  515. package/dist/host/life/index.d.ts +6 -0
  516. package/dist/host/life/index.js +6 -0
  517. package/dist/host/life/keep-awake.d.ts +10 -0
  518. package/dist/host/life/keep-awake.js +29 -0
  519. package/dist/host/life/life-record.d.ts +48 -0
  520. package/dist/host/life/life-record.js +76 -0
  521. package/dist/host/life/stop-events.d.ts +27 -0
  522. package/dist/host/life/stop-events.js +96 -0
  523. package/dist/host/life/stop-warning.d.ts +4 -0
  524. package/dist/host/life/stop-warning.js +25 -0
  525. package/dist/host/life/windows-update.d.ts +3 -0
  526. package/dist/host/life/windows-update.js +11 -0
  527. package/dist/host/native.d.ts +4 -0
  528. package/dist/host/native.js +11 -0
  529. package/dist/host/network/index.d.ts +1 -0
  530. package/dist/host/network/index.js +1 -0
  531. package/dist/host/{port-forward.d.ts → network/port-forward.d.ts} +1 -1
  532. package/dist/host/{port-forward.js → network/port-forward.js} +16 -10
  533. package/dist/host/profile/accounts.d.ts +37 -0
  534. package/dist/host/profile/accounts.js +146 -0
  535. package/dist/host/profile/claude-login.d.ts +22 -0
  536. package/dist/host/profile/claude-login.js +57 -0
  537. package/dist/host/{claude-profile.d.ts → profile/claude-profile.d.ts} +9 -9
  538. package/dist/host/{claude-profile.js → profile/claude-profile.js} +32 -22
  539. package/dist/host/profile/index.d.ts +7 -0
  540. package/dist/host/profile/index.js +7 -0
  541. package/dist/host/profile/personalize.d.ts +2 -0
  542. package/dist/host/profile/personalize.js +127 -0
  543. package/dist/host/profile/reg-file.d.ts +8 -0
  544. package/dist/host/profile/reg-file.js +45 -0
  545. package/dist/host/profile/secret-files.d.ts +2 -0
  546. package/dist/host/profile/secret-files.js +25 -0
  547. package/dist/host/profile/secret-patterns.d.ts +6 -0
  548. package/dist/host/profile/secret-patterns.js +128 -0
  549. package/dist/host/profile/secrets.d.ts +12 -0
  550. package/dist/host/profile/secrets.js +100 -0
  551. package/dist/host/projects/index.d.ts +4 -0
  552. package/dist/host/projects/index.js +4 -0
  553. package/dist/host/projects/join.d.ts +38 -0
  554. package/dist/host/projects/join.js +119 -0
  555. package/dist/host/projects/known.d.ts +28 -0
  556. package/dist/host/projects/known.js +55 -0
  557. package/dist/host/projects/mapper.d.ts +29 -0
  558. package/dist/host/projects/mapper.js +88 -0
  559. package/dist/host/projects/registry.d.ts +83 -0
  560. package/dist/host/projects/registry.js +136 -0
  561. package/dist/host/sandbox/doctor.d.ts +2 -0
  562. package/dist/host/sandbox/doctor.js +42 -0
  563. package/dist/host/sandbox/host-claude.d.ts +1 -0
  564. package/dist/host/sandbox/host-claude.js +26 -0
  565. package/dist/host/sandbox/index.d.ts +6 -0
  566. package/dist/host/sandbox/index.js +6 -0
  567. package/dist/host/{platform.d.ts → sandbox/platform.d.ts} +0 -5
  568. package/dist/host/sandbox/platform.js +60 -0
  569. package/dist/host/sandbox/probe.d.ts +3 -0
  570. package/dist/host/sandbox/probe.js +47 -0
  571. package/dist/host/{window.js → sandbox/window.js} +7 -5
  572. package/dist/host/{wsb.js → sandbox/wsb-cli.js} +31 -8
  573. package/dist/host/{cleanup.js → storage/cleanup.js} +27 -12
  574. package/dist/host/storage/index.d.ts +2 -0
  575. package/dist/host/storage/index.js +2 -0
  576. package/dist/host/storage/state-files.d.ts +4 -0
  577. package/dist/host/storage/state-files.js +10 -0
  578. package/dist/host/test-guard.js +1 -1
  579. package/dist/host/tools/conpty.d.ts +8 -0
  580. package/dist/host/tools/conpty.js +58 -0
  581. package/dist/host/tools/index.d.ts +2 -0
  582. package/dist/host/tools/index.js +2 -0
  583. package/dist/host/{terminal.d.ts → tools/windows-terminal.d.ts} +2 -10
  584. package/dist/host/{terminal.js → tools/windows-terminal.js} +33 -57
  585. package/dist/host/workspace-view/active-views.d.ts +3 -0
  586. package/dist/host/workspace-view/active-views.js +22 -0
  587. package/dist/host/workspace-view/index.d.ts +2 -18
  588. package/dist/host/workspace-view/index.js +2 -49
  589. package/dist/host/workspace-view/plan.d.ts +16 -0
  590. package/dist/host/workspace-view/plan.js +50 -0
  591. package/dist/host/workspace-view/rules.js +10 -3
  592. package/dist/host/workspace-view/view-state.d.ts +10 -0
  593. package/dist/host/workspace-view/view-state.js +31 -0
  594. package/dist/host/workspace-view/view.d.ts +1 -0
  595. package/dist/host/workspace-view/view.js +51 -55
  596. package/dist/runtime/daemon.js +4232 -1918
  597. package/dist/runtime/db.js +2145 -830
  598. package/dist/runtime/gitguard.js +29 -11
  599. package/dist/runtime/main.js +4760 -2155
  600. package/dist/runtime/netproxy.js +1654 -418
  601. package/dist/runtime/view.js +1515 -453
  602. package/dist/selftest/accounts.test.d.ts +1 -1
  603. package/dist/selftest/accounts.test.js +20 -17
  604. package/dist/selftest/agent-commands.test.d.ts +1 -1
  605. package/dist/selftest/agent-commands.test.js +9 -5
  606. package/dist/selftest/audit.test.d.ts +1 -1
  607. package/dist/selftest/audit.test.js +46 -13
  608. package/dist/selftest/channel.test.d.ts +1 -1
  609. package/dist/selftest/channel.test.js +91 -8
  610. package/dist/selftest/cli.test.d.ts +1 -1
  611. package/dist/selftest/cli.test.js +68 -16
  612. package/dist/selftest/cmdline.test.d.ts +1 -1
  613. package/dist/selftest/cmdline.test.js +36 -7
  614. package/dist/selftest/config.test.d.ts +1 -1
  615. package/dist/selftest/config.test.js +12 -5
  616. package/dist/selftest/data.test.d.ts +1 -1
  617. package/dist/selftest/data.test.js +35 -6
  618. package/dist/selftest/detect.test.d.ts +1 -1
  619. package/dist/selftest/detect.test.js +22 -9
  620. package/dist/selftest/generate.test.d.ts +1 -1
  621. package/dist/selftest/generate.test.js +33 -9
  622. package/dist/selftest/git-access.test.d.ts +1 -1
  623. package/dist/selftest/git-access.test.js +42 -4
  624. package/dist/selftest/guest-boot.test.d.ts +1 -1
  625. package/dist/selftest/guest-boot.test.js +25 -7
  626. package/dist/selftest/host-sim.test.d.ts +1 -1
  627. package/dist/selftest/host-sim.test.js +27 -3
  628. package/dist/selftest/hostile-input.test.d.ts +1 -1
  629. package/dist/selftest/hostile-input.test.js +5 -5
  630. package/dist/selftest/index.d.ts +1 -1
  631. package/dist/selftest/index.js +73 -16
  632. package/dist/selftest/layout.test.d.ts +2 -0
  633. package/dist/selftest/layout.test.js +131 -0
  634. package/dist/selftest/links.test.d.ts +1 -1
  635. package/dist/selftest/links.test.js +16 -11
  636. package/dist/selftest/live-daemon.test.d.ts +1 -1
  637. package/dist/selftest/live-daemon.test.js +20 -8
  638. package/dist/selftest/live-git.test.d.ts +1 -1
  639. package/dist/selftest/live-git.test.js +13 -4
  640. package/dist/selftest/live-network.test.d.ts +1 -1
  641. package/dist/selftest/live-network.test.js +24 -9
  642. package/dist/selftest/live-projects.test.d.ts +1 -1
  643. package/dist/selftest/live-projects.test.js +47 -20
  644. package/dist/selftest/live-terminal.test.d.ts +2 -0
  645. package/dist/selftest/live-terminal.test.js +195 -0
  646. package/dist/selftest/local-config.test.d.ts +1 -1
  647. package/dist/selftest/local-config.test.js +88 -15
  648. package/dist/selftest/mirror.test.d.ts +1 -1
  649. package/dist/selftest/mirror.test.js +118 -19
  650. package/dist/selftest/network.test.d.ts +1 -1
  651. package/dist/selftest/network.test.js +17 -8
  652. package/dist/selftest/personalization.test.d.ts +1 -1
  653. package/dist/selftest/personalization.test.js +12 -5
  654. package/dist/selftest/projects.test.d.ts +1 -1
  655. package/dist/selftest/projects.test.js +336 -72
  656. package/dist/selftest/repair.test.d.ts +1 -1
  657. package/dist/selftest/repair.test.js +17 -5
  658. package/dist/selftest/repo-guard.test.d.ts +1 -1
  659. package/dist/selftest/repo-guard.test.js +21 -20
  660. package/dist/selftest/secrets.test.d.ts +1 -1
  661. package/dist/selftest/secrets.test.js +57 -13
  662. package/dist/selftest/setup.test.d.ts +1 -1
  663. package/dist/selftest/setup.test.js +25 -5
  664. package/dist/selftest/{fixtures.d.ts → support/fixtures.d.ts} +7 -4
  665. package/dist/selftest/{fixtures.js → support/fixtures.js} +95 -17
  666. package/dist/selftest/{harness.js → support/harness.js} +24 -7
  667. package/dist/selftest/{live.d.ts → support/live.d.ts} +2 -2
  668. package/dist/selftest/{live.js → support/live.js} +34 -10
  669. package/dist/selftest/support/suite.js +1 -0
  670. package/dist/selftest/sync.test.d.ts +1 -1
  671. package/dist/selftest/sync.test.js +64 -26
  672. package/dist/selftest/test-guard.test.d.ts +1 -1
  673. package/dist/selftest/test-guard.test.js +43 -15
  674. package/dist/selftest/toolchains.test.d.ts +1 -1
  675. package/dist/selftest/toolchains.test.js +135 -36
  676. package/dist/selftest/workspace-view.test.d.ts +1 -1
  677. package/dist/selftest/workspace-view.test.js +48 -11
  678. package/dist/selftest/workspace.test.d.ts +1 -1
  679. package/dist/selftest/workspace.test.js +13 -4
  680. package/dist/shared/{apps.d.ts → apps/catalogue.d.ts} +1 -11
  681. package/dist/shared/apps/catalogue.js +768 -0
  682. package/dist/shared/apps/index.d.ts +2 -0
  683. package/dist/shared/apps/index.js +2 -0
  684. package/dist/shared/apps/selection.d.ts +11 -0
  685. package/dist/shared/apps/selection.js +40 -0
  686. package/dist/shared/channel/index.d.ts +2 -0
  687. package/dist/shared/channel/index.js +2 -0
  688. package/dist/shared/channel/run-dir.d.ts +30 -0
  689. package/dist/shared/channel/run-dir.js +84 -0
  690. package/dist/shared/{schema.d.ts → channel/schema.d.ts} +60 -19
  691. package/dist/shared/channel/schema.js +131 -0
  692. package/dist/shared/download/archive.d.ts +13 -0
  693. package/dist/shared/download/archive.js +57 -0
  694. package/dist/shared/download/downloader.d.ts +35 -0
  695. package/dist/shared/download/downloader.js +110 -0
  696. package/dist/shared/download/github.d.ts +16 -0
  697. package/dist/shared/download/github.js +74 -0
  698. package/dist/shared/download/http.d.ts +5 -0
  699. package/dist/shared/download/http.js +30 -0
  700. package/dist/shared/download/index.d.ts +5 -0
  701. package/dist/shared/download/index.js +5 -0
  702. package/dist/shared/download/spawn.d.ts +2 -0
  703. package/dist/shared/download/spawn.js +7 -0
  704. package/dist/shared/io/index.d.ts +3 -0
  705. package/dist/shared/io/index.js +3 -0
  706. package/dist/shared/io/json-file.d.ts +10 -0
  707. package/dist/shared/io/json-file.js +21 -0
  708. package/dist/shared/io/json.d.ts +13 -0
  709. package/dist/shared/io/json.js +49 -0
  710. package/dist/shared/{safe-remove.js → io/safe-remove.js} +32 -7
  711. package/dist/shared/{netrules.js → network/firewall-rules.js} +36 -5
  712. package/dist/shared/network/index.d.ts +2 -0
  713. package/dist/shared/network/index.js +2 -0
  714. package/dist/shared/{netpolicy.js → network/policy.js} +66 -11
  715. package/dist/shared/{paths.js → paths/claude-paths.js} +12 -2
  716. package/dist/shared/{guest-paths.d.ts → paths/guest-paths.d.ts} +21 -0
  717. package/dist/shared/paths/guest-paths.js +146 -0
  718. package/dist/shared/paths/index.d.ts +3 -0
  719. package/dist/shared/paths/index.js +3 -0
  720. package/dist/shared/{projects.d.ts → paths/projects.d.ts} +27 -4
  721. package/dist/shared/paths/projects.js +136 -0
  722. package/dist/shared/pty/client.d.ts +21 -0
  723. package/dist/shared/pty/client.js +79 -0
  724. package/dist/shared/pty/console-input.d.ts +11 -0
  725. package/dist/shared/pty/console-input.js +81 -0
  726. package/dist/shared/pty/index.d.ts +6 -0
  727. package/dist/shared/pty/index.js +6 -0
  728. package/dist/shared/pty/input-joiner.d.ts +15 -0
  729. package/dist/shared/pty/input-joiner.js +44 -0
  730. package/dist/shared/pty/output-filter.d.ts +13 -0
  731. package/dist/shared/pty/output-filter.js +140 -0
  732. package/dist/shared/pty/protocol.d.ts +36 -0
  733. package/dist/shared/pty/protocol.js +60 -0
  734. package/dist/shared/pty/terminal.d.ts +24 -0
  735. package/dist/shared/pty/terminal.js +147 -0
  736. package/dist/shared/test-guard.js +3 -1
  737. package/dist/sync/claude-mem.d.ts +1 -1
  738. package/dist/sync/claude-mem.js +9 -4
  739. package/dist/sync/history.d.ts +1 -29
  740. package/dist/sync/history.js +57 -45
  741. package/dist/sync/index.d.ts +5 -0
  742. package/dist/sync/index.js +5 -0
  743. package/dist/sync/sync-cycle.d.ts +18 -0
  744. package/dist/sync/sync-cycle.js +85 -0
  745. package/dist/sync/sync-state.d.ts +32 -0
  746. package/dist/sync/sync-state.js +37 -0
  747. package/dist/sync/watcher.d.ts +0 -18
  748. package/dist/sync/watcher.js +66 -100
  749. package/native/keep-awake.ps1 +8 -0
  750. package/native/power.cs +23 -0
  751. package/native/stop-events.ps1 +38 -0
  752. package/package.json +11 -3
  753. package/sandbox/linkgate.cs +98 -0
  754. package/sandbox/memlog.ps1 +15 -6
  755. package/sandbox/ptyhost.cs +60 -3
  756. package/schemas/config.schema.json +48 -1
  757. package/schemas/sandbox-config.schema.json +37 -3
  758. package/dist/cli/commands/launch.d.ts +0 -29
  759. package/dist/cli/commands/launch.js +0 -366
  760. package/dist/cli/commands/maintenance.d.ts +0 -10
  761. package/dist/cli/commands/maintenance.js +0 -187
  762. package/dist/cli/commands/project.d.ts +0 -29
  763. package/dist/cli/commands/project.js +0 -63
  764. package/dist/cli/commands/projects.d.ts +0 -14
  765. package/dist/cli/commands/projects.js +0 -146
  766. package/dist/cli/commands/restart.d.ts +0 -6
  767. package/dist/cli/commands/restart.js +0 -85
  768. package/dist/cli/commands/sessions.d.ts +0 -12
  769. package/dist/cli/commands/sessions.js +0 -257
  770. package/dist/cli/menu/settings/editors.js +0 -305
  771. package/dist/cli/progress.d.ts +0 -9
  772. package/dist/cli/progress.js +0 -49
  773. package/dist/cli/tui/dialogs.d.ts +0 -57
  774. package/dist/cli/tui/dialogs.js +0 -162
  775. package/dist/core/config.js +0 -109
  776. package/dist/core/schema.d.ts +0 -6
  777. package/dist/core/schema.js +0 -8
  778. package/dist/core/util.d.ts +0 -62
  779. package/dist/core/util.js +0 -156
  780. package/dist/core/workspace.d.ts +0 -18
  781. package/dist/core/workspace.js +0 -145
  782. package/dist/guest/boot-env.d.ts +0 -4
  783. package/dist/guest/daemon.js +0 -57
  784. package/dist/guest/env.d.ts +0 -52
  785. package/dist/guest/env.js +0 -103
  786. package/dist/guest/gitrules.js +0 -11
  787. package/dist/guest/project-status.d.ts +0 -5
  788. package/dist/guest/project-status.js +0 -17
  789. package/dist/guest/setup/user.js +0 -51
  790. package/dist/guest/toolchains/cli.d.ts +0 -10
  791. package/dist/guest/toolchains/common.d.ts +0 -54
  792. package/dist/guest/toolchains/common.js +0 -147
  793. package/dist/guest/toolchains/databases/dynamodb.d.ts +0 -8
  794. package/dist/guest/toolchains/databases/dynamodb.js +0 -52
  795. package/dist/guest/toolchains/databases/index.d.ts +0 -6
  796. package/dist/guest/toolchains/databases/index.js +0 -62
  797. package/dist/guest/toolchains/databases/mongodb.d.ts +0 -3
  798. package/dist/guest/toolchains/databases/mongodb.js +0 -31
  799. package/dist/guest/toolchains/databases/mysql.d.ts +0 -3
  800. package/dist/guest/toolchains/databases/mysql.js +0 -38
  801. package/dist/guest/toolchains/databases/postgres.d.ts +0 -5
  802. package/dist/guest/toolchains/databases/postgres.js +0 -38
  803. package/dist/guest/toolchains/databases/redis.d.ts +0 -3
  804. package/dist/guest/toolchains/databases/redis.js +0 -16
  805. package/dist/guest/toolchains/git.d.ts +0 -3
  806. package/dist/guest/toolchains/go.d.ts +0 -3
  807. package/dist/guest/toolchains/java.d.ts +0 -8
  808. package/dist/guest/toolchains/node.d.ts +0 -3
  809. package/dist/guest/toolchains/pwsh.d.ts +0 -4
  810. package/dist/guest/toolchains/python.d.ts +0 -3
  811. package/dist/guest/toolchains/scripting/php.d.ts +0 -3
  812. package/dist/guest/toolchains/scripting/ruby.d.ts +0 -3
  813. package/dist/host/accounts.d.ts +0 -32
  814. package/dist/host/accounts.js +0 -128
  815. package/dist/host/agent-commands.d.ts +0 -25
  816. package/dist/host/agent-commands.js +0 -145
  817. package/dist/host/channel.d.ts +0 -38
  818. package/dist/host/channel.js +0 -162
  819. package/dist/host/generate.d.ts +0 -13
  820. package/dist/host/generate.js +0 -108
  821. package/dist/host/join.d.ts +0 -28
  822. package/dist/host/join.js +0 -76
  823. package/dist/host/launch/projects.d.ts +0 -15
  824. package/dist/host/launch/wsb.js +0 -34
  825. package/dist/host/motw.d.ts +0 -17
  826. package/dist/host/motw.js +0 -74
  827. package/dist/host/pc-scan.d.ts +0 -6
  828. package/dist/host/personalize.d.ts +0 -10
  829. package/dist/host/personalize.js +0 -97
  830. package/dist/host/platform.js +0 -129
  831. package/dist/host/project-scan.d.ts +0 -7
  832. package/dist/host/projects.d.ts +0 -100
  833. package/dist/host/projects.js +0 -147
  834. package/dist/host/repo-guard.d.ts +0 -43
  835. package/dist/host/repo-guard.js +0 -347
  836. package/dist/host/secrets.d.ts +0 -14
  837. package/dist/host/secrets.js +0 -133
  838. package/dist/host/stops.d.ts +0 -67
  839. package/dist/host/stops.js +0 -126
  840. package/dist/shared/apps.js +0 -114
  841. package/dist/shared/download.d.ts +0 -60
  842. package/dist/shared/download.js +0 -215
  843. package/dist/shared/guest-paths.js +0 -61
  844. package/dist/shared/projects.js +0 -67
  845. package/dist/shared/pty-client.d.ts +0 -91
  846. package/dist/shared/pty-client.js +0 -349
  847. package/dist/shared/rundir.d.ts +0 -41
  848. package/dist/shared/rundir.js +0 -96
  849. package/dist/shared/schema.js +0 -92
  850. /package/dist/{guest/daemon.d.ts → cli/tui/list/list-types.js} +0 -0
  851. /package/dist/{guest/db.d.ts → cli/tui/screen.js} +0 -0
  852. /package/dist/core/{detect-databases.d.ts → detect/databases.d.ts} +0 -0
  853. /package/dist/{guest/toolchains → core/detect}/versions.d.ts +0 -0
  854. /package/dist/guest/{setup/agents.d.ts → agents/agent-installer.d.ts} +0 -0
  855. /package/dist/guest/{audit-parse.d.ts → audit/parse.d.ts} +0 -0
  856. /package/dist/guest/{guide.d.ts → boot/guide.d.ts} +0 -0
  857. /package/dist/guest/daemon/{shutdown.d.ts → idle-shutdown.d.ts} +0 -0
  858. /package/dist/guest/daemon/{session.d.ts → sessions.d.ts} +0 -0
  859. /package/dist/guest/{main.d.ts → entries/daemon.d.ts} +0 -0
  860. /package/dist/guest/{netproxy.d.ts → entries/db.d.ts} +0 -0
  861. /package/dist/{selftest/suite.js → guest/entries/gitguard.d.ts} +0 -0
  862. /package/dist/guest/{gitguard.d.ts → git/decision.d.ts} +0 -0
  863. /package/dist/guest/{ports.d.ts → runtime/ports.d.ts} +0 -0
  864. /package/dist/guest/{project-context.d.ts → runtime/project-context.d.ts} +0 -0
  865. /package/dist/guest/{cmdline.d.ts → sessions/cmdline.d.ts} +0 -0
  866. /package/dist/guest/{ptyhost.d.ts → sessions/pty-host.d.ts} +0 -0
  867. /package/dist/guest/{view.d.ts → sessions/viewer.d.ts} +0 -0
  868. /package/dist/guest/setup/{policy.d.ts → managed-policy.d.ts} +0 -0
  869. /package/dist/host/{window.d.ts → sandbox/window.d.ts} +0 -0
  870. /package/dist/host/{wsb.d.ts → sandbox/wsb-cli.d.ts} +0 -0
  871. /package/dist/host/{cleanup.d.ts → storage/cleanup.d.ts} +0 -0
  872. /package/dist/selftest/{harness.d.ts → support/harness.d.ts} +0 -0
  873. /package/dist/selftest/{suite.d.ts → support/suite.d.ts} +0 -0
  874. /package/dist/shared/{safe-remove.d.ts → io/safe-remove.d.ts} +0 -0
  875. /package/dist/shared/{netrules.d.ts → network/firewall-rules.d.ts} +0 -0
  876. /package/dist/shared/{netpolicy.d.ts → network/policy.d.ts} +0 -0
  877. /package/dist/shared/{paths.d.ts → paths/claude-paths.d.ts} +0 -0
@@ -1,12 +1,11 @@
1
1
  // What every command receives, plus the small helpers they share.
2
2
  import fs from 'node:fs';
3
3
  import path from 'node:path';
4
- import _ from 'lodash';
5
- import { loadConfig, userDir } from '../../core/config.js';
6
- import { expandPath, fail, isInsideOrEqual } from '../../core/util.js';
7
- import { GUEST_DATA_DIR, insideSandbox, isSandboxRunning } from '../../host/platform.js';
4
+ import { loadConfig, userDir } from '../../core/config/index.js';
5
+ import { expandPath, fail, isInsideOrEqual } from '../../core/util/index.js';
6
+ import { GUEST_DATA_DIR, insideSandbox, isSandboxRunning } from '../../host/sandbox/index.js';
8
7
  /** Keeps ~/.agent-sandbox/*.schema.json in step with the installed version (local schema paths editors trust). */
9
- const refreshSchemas = (packageRoot) => {
8
+ function refreshSchemas(packageRoot) {
10
9
  const source = path.join(packageRoot, 'schemas');
11
10
  if (!fs.existsSync(source))
12
11
  return;
@@ -19,40 +18,44 @@ const refreshSchemas = (packageRoot) => {
19
18
  fs.writeFileSync(target, text, 'utf8');
20
19
  }
21
20
  }
22
- catch { /* editor help only; never block a command over it */ }
23
- };
24
- export const createContext = (packageRoot, entry, options) => {
21
+ catch {
22
+ /* editor help only; never block a command over it */
23
+ }
24
+ }
25
+ export function createContext(packageRoot, entry, options) {
25
26
  refreshSchemas(packageRoot);
26
27
  const loaded = loadConfig(options.config);
27
28
  const storageRoot = expandPath(loaded.config.storage.root, loaded.base);
28
29
  // Inside a sandbox, the sandbox's own data folder is the one to talk to.
29
- return { packageRoot, entry, options, loaded, storageRoot, dataPath: insideSandbox() ? GUEST_DATA_DIR : path.join(storageRoot, 'data', loaded.config.storage.dataName) };
30
- };
31
- /** Prints rows as aligned columns (the last column is not padded). */
32
- export const table = (rows) => {
33
- const widths = _.range(_.max(rows.map((r) => r.length)) ?? 0).map((i) => _.max(rows.map((r) => (r[i] ?? '').length)) ?? 0);
34
- for (const row of rows)
35
- console.log(row.map((cell, i) => (i === row.length - 1 ? cell : _.padEnd(cell, widths[i] + 2))).join(''));
36
- };
37
- /** Prints `value` as JSON when --json was given; returns whether it did. */
38
- export const printJson = (ctx, value) => {
39
- // JSON.stringify leaves C1 controls (U+0080-U+009F) as they are; text from the sandbox must not reach a terminal raw.
40
- if (ctx.options.json)
41
- console.log(JSON.stringify(value, null, 2).replace(/[\u0080-\u009f]/g, (ch) => '\\u' + ch.charCodeAt(0).toString(16).padStart(4, '0')));
42
- return ctx.options.json;
43
- };
44
- export const sandboxAlive = () => isSandboxRunning();
30
+ return {
31
+ packageRoot,
32
+ entry,
33
+ options,
34
+ loaded,
35
+ storageRoot,
36
+ dataPath: insideSandbox() ? GUEST_DATA_DIR : path.join(storageRoot, 'data', loaded.config.storage.dataName),
37
+ };
38
+ }
45
39
  /** For commands that control the sandbox from your PC: inside the sandbox they make no sense. */
46
- export const requireOnPc = (what) => { if (insideSandbox())
47
- fail('You are inside the sandbox already, so "sandbox ' + what + '" has nothing to control.', 'Run it from a terminal on your PC.'); };
48
- export const requireRunning = (hint = '') => { if (!isSandboxRunning())
49
- fail('No Windows Sandbox is running.', hint || 'Start one with sandbox claude.'); };
50
- /** Maps a folder on this PC to its path inside the running sandbox (only folders inside the mapped workspace exist there). */
51
- export const guestPathFor = (hostDir, workspaceHost, guestWorkspace) => {
40
+ export function requireOnPc(what) {
41
+ if (insideSandbox())
42
+ fail('You are inside the sandbox already, so "sandbox ' + what + '" has nothing to control.', 'Run it from a terminal on your PC.');
43
+ }
44
+ export function requireRunning(hint = '') {
45
+ if (!isSandboxRunning())
46
+ fail('No Windows Sandbox is running.', hint || 'Start one with sandbox claude.');
47
+ }
48
+ /**
49
+ * Maps a folder on this PC to its path inside the running sandbox (only folders inside the mapped workspace exist
50
+ * there).
51
+ */
52
+ export function guestPathFor(hostDir, workspaceHost, guestWorkspace) {
52
53
  if (!isInsideOrEqual(workspaceHost, hostDir))
53
54
  fail('The running sandbox works on ' + workspaceHost + ', and Windows Sandbox cannot add folders while it runs.', 'Run from inside that folder, or stop the sandbox (sandbox stop) and launch again from ' + hostDir + '.');
54
55
  const rel = path.relative(workspaceHost, hostDir);
55
56
  return rel ? path.win32.join(guestWorkspace, rel) : guestWorkspace;
56
- };
57
+ }
57
58
  /** The guest folder for the current directory (or --workspace) in the running sandbox. */
58
- export const currentGuestDir = (ctx, workspaceHost, guestWorkspace) => guestPathFor(path.resolve(ctx.options.workspace ?? process.cwd()), workspaceHost, guestWorkspace);
59
+ export function currentGuestDir(ctx, workspaceHost, guestWorkspace) {
60
+ return guestPathFor(path.resolve(ctx.options.workspace ?? process.cwd()), workspaceHost, guestWorkspace);
61
+ }
@@ -11,5 +11,5 @@ export interface CleanTarget {
11
11
  * Turns `sandbox data clean` arguments into folders. Pure (no disk access); throws a UserError for anything that is
12
12
  * not a plain relative target inside the data folder: absolute paths, drive letters, `..`, wildcards, unknown areas.
13
13
  */
14
- export declare const resolveCleanTargets: (inputs: string[], dataPath: string, storageRoot: string) => CleanTarget[];
15
- export declare const dataClean: (ctx: Context) => Promise<number>;
14
+ export declare function resolveCleanTargets(inputs: string[], dataPath: string, storageRoot: string): CleanTarget[];
15
+ export declare function dataClean(ctx: Context): Promise<number>;
@@ -4,9 +4,9 @@ import path from 'node:path';
4
4
  import _ from 'lodash';
5
5
  import { humanBytes, sizeOf } from '../../../core/disk.js';
6
6
  import { askTyped, askYesNo } from '../../../core/prompt.js';
7
- import { assertNoLinks, fail, isInsideOrEqual, isLink } from '../../../core/util.js';
8
- import { isSandboxRunning } from '../../../host/platform.js';
9
- import { table } from '../context.js';
7
+ import { assertNoLinks, fail, isInsideOrEqual, isLink } from '../../../core/util/index.js';
8
+ import { isSandboxRunning } from '../../../host/sandbox/index.js';
9
+ import { table } from '../../output/index.js';
10
10
  import { removeTree } from './remove.js';
11
11
  const DATA_AREAS = ['tools', 'databases', 'state', 'logs'];
12
12
  const SEGMENT = /^[A-Za-z0-9][A-Za-z0-9._ +@-]*$/;
@@ -16,7 +16,7 @@ const ALL_WARNING = 'removes EVERYTHING the sandbox keeps: toolchains, databases
16
16
  * Turns `sandbox data clean` arguments into folders. Pure (no disk access); throws a UserError for anything that is
17
17
  * not a plain relative target inside the data folder: absolute paths, drive letters, `..`, wildcards, unknown areas.
18
18
  */
19
- export const resolveCleanTargets = (inputs, dataPath, storageRoot) => {
19
+ export function resolveCleanTargets(inputs, dataPath, storageRoot) {
20
20
  const usage = 'Targets: all | tools | tools/<name> | tools/agents/<name> | databases | databases/<name> | state | state/<agent> | logs | launches | views. See them with: sandbox data';
21
21
  if (!inputs.length)
22
22
  fail('Say what to remove.', usage);
@@ -42,7 +42,12 @@ export const resolveCleanTargets = (inputs, dataPath, storageRoot) => {
42
42
  if (area === 'views') {
43
43
  if (rest.length)
44
44
  fail('Remove all views ("views"), not single ones.', usage);
45
- return { target, path: path.join(storageRoot, 'views'), root: storageRoot, warning: 'Views are the copies of your projects without their git-ignored files (workspaceFilter). Your projects are not touched; what the sandbox built or installed in them (node_modules, build output) goes, and the next start copies the projects again.' };
45
+ return {
46
+ target,
47
+ path: path.join(storageRoot, 'views'),
48
+ root: storageRoot,
49
+ warning: 'Views are the copies of your projects without their git-ignored files (workspaceFilter). Your projects are not touched; what the sandbox built or installed in them (node_modules, build output) goes, and the next start copies the projects again.',
50
+ };
46
51
  }
47
52
  if (area === 'accounts' || area === 'sync')
48
53
  fail('"' + area + '" is kept on this PC on purpose and is not removed here.', area === 'accounts' ? 'Remove a saved login with: sandbox account remove <name>' : usage);
@@ -52,7 +57,12 @@ export const resolveCleanTargets = (inputs, dataPath, storageRoot) => {
52
57
  fail('Remove all logs ("logs"), not single files.', usage);
53
58
  if (rest.length > (area === 'tools' && rest[0]?.toLowerCase() === 'agents' ? 2 : 1))
54
59
  fail('Refusing "' + raw + '": too deep.', usage);
55
- return { target, path: path.join(dataPath, area, ...rest), root: dataPath, ...(area === 'state' ? { warning: LOGIN_WARNING } : {}) };
60
+ return {
61
+ target,
62
+ path: path.join(dataPath, area, ...rest),
63
+ root: dataPath,
64
+ ...(area === 'state' ? { warning: LOGIN_WARNING } : {}),
65
+ };
56
66
  });
57
67
  // "all" covers everything; otherwise drop targets inside another target (tools + tools/go = tools).
58
68
  const all = resolved.find((t) => t.target === 'all');
@@ -60,12 +70,13 @@ export const resolveCleanTargets = (inputs, dataPath, storageRoot) => {
60
70
  return [all, { target: 'launches', path: path.join(storageRoot, 'launches'), root: storageRoot }];
61
71
  const unique = _.uniqBy(resolved, (t) => t.path.toLowerCase());
62
72
  return unique.filter((t) => !unique.some((o) => o !== t && isInsideOrEqual(o.path, t.path)));
63
- };
64
- export const dataClean = async (ctx) => {
73
+ }
74
+ export async function dataClean(ctx) {
65
75
  const targets = resolveCleanTargets(ctx.options.positionals.slice(1), ctx.dataPath, ctx.storageRoot);
66
76
  if (isSandboxRunning())
67
77
  fail('A Windows Sandbox is running, and it uses these folders.', 'Close it first (sandbox stop), then run this again.');
68
- // Every folder from the root down to the target's parent must be real; a link in place of the target is removed itself.
78
+ // Every folder from the root down to the target's parent must be real; a link in place of the target is removed
79
+ // itself.
69
80
  for (const t of targets)
70
81
  assertNoLinks(t.root, path.dirname(t.path));
71
82
  const present = targets.filter((t) => fs.existsSync(t.path) || isLink(t.path));
@@ -99,8 +110,13 @@ export const dataClean = async (ctx) => {
99
110
  }
100
111
  }
101
112
  const freed = total - _.sumBy(sized, (t) => sizeOf(t.path));
102
- console.log('Freed ' + humanBytes(freed) + '. ' + (sized.some((t) => t.root === ctx.dataPath || t.target === 'all') ? 'The next sandbox reinstalls what it needs.' : ''));
113
+ console.log('Freed ' +
114
+ humanBytes(freed) +
115
+ '. ' +
116
+ (sized.some((t) => t.root === ctx.dataPath || t.target === 'all')
117
+ ? 'The next sandbox reinstalls what it needs.'
118
+ : ''));
103
119
  if (failed.length)
104
120
  fail('Could not remove everything: ' + failed.join('; '), 'Close programs using those folders and run the same command again.');
105
121
  return 0;
106
- };
122
+ }
@@ -6,6 +6,9 @@ export interface DataEntry {
6
6
  bytes: number;
7
7
  }
8
8
  /** Every row of `sandbox data`: the sandbox's data folder by area, then what this PC keeps for it. */
9
- export declare const collectDataEntries: (dataPath: string, storageRoot: string) => DataEntry[];
10
- /** The `sandbox data clean` target for a listed row, or null when that row is not removable (kept on this PC on purpose). */
11
- export declare const cleanTargetOf: (entry: DataEntry) => string | null;
9
+ export declare function collectDataEntries(dataPath: string, storageRoot: string): DataEntry[];
10
+ /**
11
+ * The `sandbox data clean` target for a listed row, or null when that row is not removable (kept on this PC on
12
+ * purpose).
13
+ */
14
+ export declare function cleanTargetOf(entry: DataEntry): string | null;
@@ -3,26 +3,39 @@ import fs from 'node:fs';
3
3
  import path from 'node:path';
4
4
  import _ from 'lodash';
5
5
  import { sizeOf } from '../../../core/disk.js';
6
- import { dirExists, isLink } from '../../../core/util.js';
6
+ import { dirExists, isLink } from '../../../core/util/index.js';
7
7
  const AREA_ORDER = ['tools', 'databases', 'state', 'logs', 'data', 'host'];
8
8
  /** Folders of the data folder that get one row per child; anything else at the top level is listed as itself. */
9
9
  const PER_CHILD = ['tools', 'databases', 'state'];
10
10
  /** Real (non-link) children of a real folder; a link in place of the folder yields nothing. */
11
- const entriesOf = (dir) => (dirExists(dir) && !isLink(dir) ? fs.readdirSync(dir, { withFileTypes: true }).filter((d) => !d.isSymbolicLink()) : []);
12
- const toolRows = (toolsDir) => {
11
+ function entriesOf(dir) {
12
+ return dirExists(dir) && !isLink(dir)
13
+ ? fs.readdirSync(dir, { withFileTypes: true }).filter((d) => !d.isSymbolicLink())
14
+ : [];
15
+ }
16
+ function toolRows(toolsDir) {
13
17
  const entries = entriesOf(toolsDir);
14
18
  const folders = entries.filter((d) => d.isDirectory());
15
19
  const files = entries.filter((d) => !d.isDirectory());
16
20
  const row = (name, p) => ({ area: 'tools', name, path: p, bytes: sizeOf(p) });
17
21
  return [
18
- ...folders.flatMap((d) => (d.name.toLowerCase() === 'agents'
22
+ ...folders.flatMap((d) => d.name.toLowerCase() === 'agents'
19
23
  ? entriesOf(path.join(toolsDir, d.name)).map((a) => row('agents/' + a.name, path.join(toolsDir, d.name, a.name)))
20
- : [row(d.name, path.join(toolsDir, d.name))])),
21
- ...(files.length ? [{ area: 'tools', name: '(files in tools)', path: toolsDir, bytes: _.sumBy(files, (f) => sizeOf(path.join(toolsDir, f.name))) }] : []),
24
+ : [row(d.name, path.join(toolsDir, d.name))]),
25
+ ...(files.length
26
+ ? [
27
+ {
28
+ area: 'tools',
29
+ name: '(files in tools)',
30
+ path: toolsDir,
31
+ bytes: _.sumBy(files, (f) => sizeOf(path.join(toolsDir, f.name))),
32
+ },
33
+ ]
34
+ : []),
22
35
  ];
23
- };
36
+ }
24
37
  /** Every row of `sandbox data`: the sandbox's data folder by area, then what this PC keeps for it. */
25
- export const collectDataEntries = (dataPath, storageRoot) => {
38
+ export function collectDataEntries(dataPath, storageRoot) {
26
39
  const inData = entriesOf(dataPath);
27
40
  const rows = inData.flatMap((d) => {
28
41
  const p = path.join(dataPath, d.name);
@@ -30,18 +43,36 @@ export const collectDataEntries = (dataPath, storageRoot) => {
30
43
  if (area === 'tools')
31
44
  return toolRows(p);
32
45
  if (PER_CHILD.includes(area))
33
- return entriesOf(p).map((c) => ({ area, name: area + '/' + c.name, path: path.join(p, c.name), bytes: sizeOf(path.join(p, c.name)) }));
46
+ return entriesOf(p).map((c) => ({
47
+ area,
48
+ name: area + '/' + c.name,
49
+ path: path.join(p, c.name),
50
+ bytes: sizeOf(path.join(p, c.name)),
51
+ }));
34
52
  return [{ area: area === 'logs' ? 'logs' : 'data', name: d.name, path: p, bytes: sizeOf(p) }];
35
53
  });
36
54
  const otherData = entriesOf(path.join(storageRoot, 'data')).filter((d) => d.isDirectory() && path.join(storageRoot, 'data', d.name).toLowerCase() !== path.resolve(dataPath).toLowerCase());
37
55
  const host = [
38
- ...['launches', 'views', 'accounts', 'sync', 'logs', 'run', 'host'].map((name) => ({ area: 'host', name, path: path.join(storageRoot, name), bytes: sizeOf(path.join(storageRoot, name)) })),
39
- ...otherData.map((d) => ({ area: 'host', name: 'other data folder: ' + d.name, path: path.join(storageRoot, 'data', d.name), bytes: sizeOf(path.join(storageRoot, 'data', d.name)) })),
56
+ ...['launches', 'views', 'accounts', 'sync', 'logs', 'run', 'host'].map((name) => ({
57
+ area: 'host',
58
+ name,
59
+ path: path.join(storageRoot, name),
60
+ bytes: sizeOf(path.join(storageRoot, name)),
61
+ })),
62
+ ...otherData.map((d) => ({
63
+ area: 'host',
64
+ name: 'other data folder: ' + d.name,
65
+ path: path.join(storageRoot, 'data', d.name),
66
+ bytes: sizeOf(path.join(storageRoot, 'data', d.name)),
67
+ })),
40
68
  ].filter((r) => fs.existsSync(r.path));
41
69
  return _.sortBy([...rows, ...host], (r) => AREA_ORDER.indexOf(r.area), (r) => -r.bytes, (r) => r.name.toLowerCase());
42
- };
43
- /** The `sandbox data clean` target for a listed row, or null when that row is not removable (kept on this PC on purpose). */
44
- export const cleanTargetOf = (entry) => {
70
+ }
71
+ /**
72
+ * The `sandbox data clean` target for a listed row, or null when that row is not removable (kept on this PC on
73
+ * purpose).
74
+ */
75
+ export function cleanTargetOf(entry) {
45
76
  if (entry.area === 'tools')
46
77
  return entry.name.startsWith('(') ? null : 'tools/' + entry.name;
47
78
  if (entry.area === 'databases' || entry.area === 'state')
@@ -51,4 +82,4 @@ export const cleanTargetOf = (entry) => {
51
82
  if (entry.area === 'host' && (entry.name === 'launches' || entry.name === 'views'))
52
83
  return entry.name;
53
84
  return null;
54
- };
85
+ }
@@ -1,4 +1,4 @@
1
1
  import { type Context } from '../context.js';
2
- export declare const dataInfo: (ctx: Context) => Promise<number>;
2
+ export declare function dataInfo(ctx: Context): Promise<number>;
3
3
  /** `sandbox data [info|clean] [targets...]`. */
4
- export declare const data: (ctx: Context) => number | Promise<number>;
4
+ export declare function data(ctx: Context): number | Promise<number>;
@@ -3,20 +3,35 @@
3
3
  // links, and targets resolve strictly inside the data folder.
4
4
  import _ from 'lodash';
5
5
  import { diskUsage, humanBytes } from '../../../core/disk.js';
6
- import { fail } from '../../../core/util.js';
7
- import { printJson, table } from '../context.js';
8
- import { working } from '../../progress.js';
6
+ import { fail } from '../../../core/util/index.js';
7
+ import { printJson, table, working } from '../../output/index.js';
9
8
  import { dataClean } from './clean.js';
10
9
  import { collectDataEntries } from './collect.js';
11
- const AREA_LABEL = { tools: 'Toolchains', databases: 'Databases', state: 'Agent state', logs: 'Logs', data: 'Other', host: 'On this PC' };
12
- export const dataInfo = async (ctx) => {
10
+ const AREA_LABEL = {
11
+ tools: 'Toolchains',
12
+ databases: 'Databases',
13
+ state: 'Agent state',
14
+ logs: 'Logs',
15
+ data: 'Other',
16
+ host: 'On this PC',
17
+ };
18
+ export async function dataInfo(ctx) {
13
19
  const entries = await working('Measuring the saved data (big folders take a moment)', () => collectDataEntries(ctx.dataPath, ctx.storageRoot), !ctx.options.json);
14
20
  const total = _.sumBy(entries, 'bytes');
15
21
  const disks = diskUsage(ctx.storageRoot);
16
22
  if (printJson(ctx, { dataPath: ctx.dataPath, storageRoot: ctx.storageRoot, totalBytes: total, entries, disks }))
17
23
  return 0;
18
24
  console.log('Disks\n');
19
- table([['DRIVE', 'USED', 'FREE', 'SIZE', ''], ...disks.map((d) => [d.drive, humanBytes(d.usedBytes) + ' (' + Math.round((d.usedBytes / d.totalBytes) * 100) + '%)', humanBytes(d.freeBytes), humanBytes(d.totalBytes), d.holdsStorage ? '<- sandbox storage (' + humanBytes(total) + ' of it)' : ''])]);
25
+ table([
26
+ ['DRIVE', 'USED', 'FREE', 'SIZE', ''],
27
+ ...disks.map((d) => [
28
+ d.drive,
29
+ humanBytes(d.usedBytes) + ' (' + Math.round((d.usedBytes / d.totalBytes) * 100) + '%)',
30
+ humanBytes(d.freeBytes),
31
+ humanBytes(d.totalBytes),
32
+ d.holdsStorage ? '<- sandbox storage (' + humanBytes(total) + ' of it)' : '',
33
+ ]),
34
+ ]);
20
35
  console.log('');
21
36
  console.log('Persistent data for the sandbox: ' + ctx.dataPath + ' (C:\\AgentData inside)\n');
22
37
  if (!entries.length) {
@@ -30,16 +45,19 @@ export const dataInfo = async (ctx) => {
30
45
  table([...rows, ['', '', ''], ['Total', humanBytes(total), '']]);
31
46
  console.log('\nFree space with: sandbox data clean <target...> (e.g. tools/go, databases/postgres-18, logs, launches)');
32
47
  return 0;
33
- };
48
+ }
34
49
  /** `sandbox data [info|clean] [targets...]`. */
35
- export const data = (ctx) => {
50
+ export function data(ctx) {
36
51
  const [action = 'info'] = ctx.options.positionals;
37
52
  switch (action) {
38
53
  case 'info':
39
54
  case 'show':
40
- case 'list': return dataInfo(ctx);
55
+ case 'list':
56
+ return dataInfo(ctx);
41
57
  case 'clean':
42
- case 'remove': return dataClean(ctx);
43
- default: return fail('Unknown data action "' + action + '".', 'Use: sandbox data (what is stored) or sandbox data clean <target...>');
58
+ case 'remove':
59
+ return dataClean(ctx);
60
+ default:
61
+ return fail('Unknown data action "' + action + '".', 'Use: sandbox data (what is stored) or sandbox data clean <target...>');
44
62
  }
45
- };
63
+ }
@@ -1,2 +1,2 @@
1
1
  /** Deletes p (strictly inside root): links inside are removed first and never followed; see shared/safe-remove.ts. */
2
- export declare const removeTree: (p: string, root: string) => void;
2
+ export declare function removeTree(p: string, root: string): void;
@@ -1,10 +1,10 @@
1
1
  // Deleting inside the data folder. The sandbox can write there, so links are removed themselves and never followed.
2
2
  import fs from 'node:fs';
3
3
  import path from 'node:path';
4
- import { dirExists, isLink, removeLink } from '../../../core/util.js';
5
- import { removeRefusal, safeRemove } from '../../../shared/safe-remove.js';
4
+ import { dirExists, isLink, removeLink } from '../../../core/util/index.js';
5
+ import { removeRefusal, safeRemove } from '../../../shared/io/index.js';
6
6
  /** Deletes p (strictly inside root): links inside are removed first and never followed; see shared/safe-remove.ts. */
7
- export const removeTree = (p, root) => {
7
+ export function removeTree(p, root) {
8
8
  const unlinkInside = (dir) => {
9
9
  for (const d of fs.readdirSync(dir, { withFileTypes: true })) {
10
10
  const child = path.join(dir, d.name);
@@ -27,4 +27,4 @@ export const removeTree = (p, root) => {
27
27
  if (dirExists(p))
28
28
  unlinkInside(p);
29
29
  safeRemove(p, root);
30
- };
30
+ }
@@ -1,10 +1,11 @@
1
1
  export { createContext, type Context } from './context.js';
2
- export { launch } from './launch.js';
2
+ export { launch } from './launch/index.js';
3
3
  export { setup } from './setup/index.js';
4
4
  export { data } from './data/index.js';
5
5
  export { repairCommand } from './repair/index.js';
6
- export { attach, db, exec, hide, restart, sessions, show, status, stop } from './sessions.js';
6
+ export { attach, db, exec, hide, show, restart, stop, sessions, status } from './sessions/index.js';
7
7
  export { account } from './accounts.js';
8
- export { projects } from './projects.js';
9
- export { audit, claudeHost, clean, config, doctor, logs, sync, watcher } from './maintenance.js';
8
+ export { projects } from './projects/index.js';
9
+ export { audit, claudeHost, clean, config, doctor, logs, sync, watcher } from './maintenance/index.js';
10
10
  export { agentCommandsCommand, syncAgentCommands } from './agent-commands.js';
11
+ export { HANDLERS, type Handler } from './registry.js';
@@ -1,10 +1,11 @@
1
1
  export { createContext } from './context.js';
2
- export { launch } from './launch.js';
2
+ export { launch } from './launch/index.js';
3
3
  export { setup } from './setup/index.js';
4
4
  export { data } from './data/index.js';
5
5
  export { repairCommand } from './repair/index.js';
6
- export { attach, db, exec, hide, restart, sessions, show, status, stop } from './sessions.js';
6
+ export { attach, db, exec, hide, show, restart, stop, sessions, status } from './sessions/index.js';
7
7
  export { account } from './accounts.js';
8
- export { projects } from './projects.js';
9
- export { audit, claudeHost, clean, config, doctor, logs, sync, watcher } from './maintenance.js';
8
+ export { projects } from './projects/index.js';
9
+ export { audit, claudeHost, clean, config, doctor, logs, sync, watcher } from './maintenance/index.js';
10
10
  export { agentCommandsCommand, syncAgentCommands } from './agent-commands.js';
11
+ export { HANDLERS } from './registry.js';
@@ -0,0 +1,7 @@
1
+ import type { ResolvedRun } from '../../../core/types.js';
2
+ import { type Context } from '../context.js';
3
+ /**
4
+ * Asked once per parent folder: map it at every start (a project root), so the projects next to this one open in the
5
+ * running sandbox without a restart. The answer is saved to your config.
6
+ */
7
+ export declare function maybeAddRoot(ctx: Context, run: ResolvedRun): Promise<void>;
@@ -0,0 +1,64 @@
1
+ import path from 'node:path';
2
+ import { select } from '@inquirer/prompts';
3
+ import { isWithin, planMirrorWorkspace } from '../../../shared/paths/index.js';
4
+ import { assertSafeMapping, assertSafeWorkspace } from '../../../core/safe-paths.js';
5
+ import { isRootPath } from '../../../core/util/index.js';
6
+ import { autoGuestWorkspace, placeInRoot } from '../../../core/run/index.js';
7
+ import { addToList, setSetting } from '../user-config.js';
8
+ /**
9
+ * Asked once per parent folder: map it at every start (a project root), so the projects next to this one open in the
10
+ * running sandbox without a restart. The answer is saved to your config.
11
+ */
12
+ export async function maybeAddRoot(ctx, run) {
13
+ const { projects } = run.config;
14
+ const parent = path.dirname(run.workspaceHost);
15
+ if (!projects.askToAddRoot || ctx.options.yes || !process.stdin.isTTY || !process.stdout.isTTY)
16
+ return;
17
+ if (projects.roots.some((r) => isWithin(r, run.workspaceHost)) ||
18
+ projects.declinedRoots.some((d) => isWithin(d, parent) && isWithin(parent, d)))
19
+ return;
20
+ if (isRootPath(parent))
21
+ return;
22
+ try {
23
+ assertSafeWorkspace(parent, ctx.packageRoot, run.storageRoot);
24
+ assertSafeMapping(parent, ctx.packageRoot, run.storageRoot);
25
+ }
26
+ catch {
27
+ return;
28
+ }
29
+ const answer = await select({
30
+ message: 'Map ' +
31
+ parent +
32
+ ' at every start, so other projects there (also new ones) open in the running sandbox without a restart? Agents in the sandbox can then see every project in it.',
33
+ choices: [
34
+ { name: 'Yes, from now on', value: 'yes' },
35
+ { name: 'No (and do not ask again for this folder)', value: 'no' },
36
+ { name: 'Never ask this again', value: 'never' },
37
+ ],
38
+ });
39
+ if (answer === 'yes') {
40
+ addToList(ctx, ['projects', 'roots'], parent);
41
+ run.config.projects.roots.push(parent);
42
+ console.log('Added ' + parent + ' to projects.roots (sandbox projects roots remove ' + parent + ' undoes it).');
43
+ moveUnderRoot(run);
44
+ }
45
+ if (answer === 'no')
46
+ addToList(ctx, ['projects', 'declinedRoots'], parent);
47
+ if (answer === 'never')
48
+ setSetting(ctx, ['projects', 'askToAddRoot'], false);
49
+ }
50
+ /** From now on this project is under the root's folder inside the sandbox, from this start on (one move, not two). */
51
+ function moveUnderRoot(run) {
52
+ const before = run.config.guestWorkspace;
53
+ const auto = autoGuestWorkspace(run.workspaceHost);
54
+ const derived = [auto, planMirrorWorkspace(run.workspaceHost, auto).guest];
55
+ // In place: the caller holds run.config already.
56
+ if (derived.some((g) => g.toLowerCase() === before.toLowerCase()))
57
+ run.config.guestWorkspace = placeInRoot(run.config, run.workspaceHost, Boolean(run.mirror), run.notes).guestWorkspace;
58
+ if (run.config.guestWorkspace !== before)
59
+ console.log('Inside the sandbox this project is now at ' +
60
+ run.config.guestWorkspace +
61
+ ' (was ' +
62
+ before +
63
+ '): git worktrees made at the old place need `git worktree repair` once.');
64
+ }
@@ -0,0 +1,7 @@
1
+ import type { SandboxStatus } from '../../../core/types.js';
2
+ import { type Progressing } from '../../output/index.js';
3
+ /** "[3/8] Developer tools: downloading rust 40%, setting up go (2 of 6 done)". */
4
+ export declare function bootLine(status: SandboxStatus | null, fallback?: string): Progressing;
5
+ /** Nothing new for a while: say so, and where the details are. */
6
+ export declare function stillWorking(what: string, ms: number): string;
7
+ export declare function readyIn(ms: number): string;
@@ -0,0 +1,48 @@
1
+ // One line of progress from the guest's status while a sandbox starts. Pure: the status is guest-written, so every
2
+ // bit of it is made safe and short here.
3
+ import { plainText } from '../../../core/util/index.js';
4
+ import { elapsed } from '../../output/index.js';
5
+ function clean(text, max) {
6
+ return plainText(text).replace(/\s+/g, ' ').trim().slice(0, max);
7
+ }
8
+ /** "[3/8] Developer tools: downloading rust 40%, setting up go (2 of 6 done)". */
9
+ export function bootLine(status, fallback = 'Starting Windows Sandbox') {
10
+ if (!status)
11
+ return { line: fallback, key: fallback, what: fallback.toLowerCase() };
12
+ const p = status.progress;
13
+ if (!p) {
14
+ const line = clean(status.message, 200) || fallback;
15
+ return { line, key: line, what: line };
16
+ }
17
+ const title = clean(p.title, 60);
18
+ const items = p.active.slice(0, 8).map((a) => ({ name: clean(a.name, 40), percent: a.percent }));
19
+ const loading = items.filter((a) => a.percent !== undefined && a.percent < 100);
20
+ const others = items.filter((a) => !loading.includes(a));
21
+ const parts = [
22
+ ...(loading.length ? ['downloading ' + loading.map((a) => a.name + ' ' + a.percent + '%').join(', ')] : []),
23
+ ...(others.length ? ['setting up ' + others.map((a) => a.name).join(', ')] : []),
24
+ ];
25
+ const count = p.total > 0 && items.length ? ' (' + Math.min(p.done, p.total) + ' of ' + p.total + ' done)' : '';
26
+ const head = '[' + p.step + '/' + p.steps + '] ' + title;
27
+ return {
28
+ line: (head + (parts.length ? ': ' + parts.join('; ') : '') + count).slice(0, 240),
29
+ key: head +
30
+ '|' +
31
+ items
32
+ .map((a) => a.name)
33
+ .sort()
34
+ .join(','),
35
+ what: items.length ? items.map((a) => a.name).join(', ') : title,
36
+ };
37
+ }
38
+ /** Nothing new for a while: say so, and where the details are. */
39
+ export function stillWorking(what, ms) {
40
+ return ('Still working on ' +
41
+ clean(what, 80) +
42
+ ' (' +
43
+ Math.max(1, Math.round(ms / 60000)) +
44
+ ' min). Full log: sandbox logs -f');
45
+ }
46
+ export function readyIn(ms) {
47
+ return 'Ready in ' + elapsed(ms) + '.';
48
+ }
@@ -0,0 +1,11 @@
1
+ import type { GenerateOptions, ResolvedRun } from '../../../core/types.js';
2
+ import type { Context } from '../context.js';
3
+ /**
4
+ * The other projects mapped at boot (a restart's, --session's, projects.all's, and the known projects in your roots),
5
+ * with their effective configs: only approved .sandbox-config.json files and the looser values you allowed for each
6
+ * (nothing is asked here). The sandbox boots with what they want too (host/launch/generate.ts).
7
+ */
8
+ export declare function bootWantsFor(ctx: Context, run: ResolvedRun, extraProjects: string[] | undefined): Promise<{
9
+ wants: NonNullable<GenerateOptions['bootWants']>;
10
+ notes: string[];
11
+ }>;
@@ -0,0 +1,48 @@
1
+ // What the other projects mapped at boot want from the sandbox (a .wsb device, memory, their mappings).
2
+ import path from 'node:path';
3
+ import _ from 'lodash';
4
+ import { planBootProjects } from '../../../host/launch/index.js';
5
+ import { KnownProjects } from '../../../host/projects/index.js';
6
+ import { isWithin } from '../../../shared/paths/index.js';
7
+ import { BOOT_SETTINGS, LOCAL_CONFIG_NAME } from '../../../core/local-config/index.js';
8
+ import { resolveRun } from '../../../core/run/index.js';
9
+ import { dirExists, errMsg, fileExists } from '../../../core/util/index.js';
10
+ /**
11
+ * The other projects mapped at boot (a restart's, --session's, projects.all's, and the known projects in your roots),
12
+ * with their effective configs: only approved .sandbox-config.json files and the looser values you allowed for each
13
+ * (nothing is asked here). The sandbox boots with what they want too (host/launch/generate.ts).
14
+ */
15
+ export async function bootWantsFor(ctx, run, extraProjects) {
16
+ const { roots } = run.config.projects;
17
+ const planned = planBootProjects({ run, packageRoot: ctx.packageRoot, extraProjects }).projects.map((p) => p.host);
18
+ const inRoots = new KnownProjects(run.storageRoot)
19
+ .list()
20
+ .map((k) => k.host)
21
+ .filter((h) => roots.some((r) => isWithin(path.resolve(r), h)));
22
+ const folders = _.uniqBy([...(extraProjects ?? []).map((p) => path.resolve(p)), ...planned, ...inRoots], (f) => f.toLowerCase())
23
+ .filter((f) => !isWithin(run.workspaceHost, f) && dirExists(f))
24
+ .slice(0, 200);
25
+ const projects = [];
26
+ const notes = [];
27
+ for (const folder of folders) {
28
+ try {
29
+ const other = await resolveRun({
30
+ packageRoot: ctx.packageRoot,
31
+ loaded: ctx.loaded,
32
+ cwd: folder,
33
+ workspace: folder,
34
+ noAgent: true,
35
+ noLocalConfig: false,
36
+ trustConfig: false,
37
+ scripts: [],
38
+ });
39
+ projects.push({ name: path.basename(folder), config: other.config });
40
+ }
41
+ catch (e) {
42
+ if (fileExists(path.join(folder, LOCAL_CONFIG_NAME)))
43
+ notes.push('What ' + path.basename(folder) + ' asks for at boot is not included: ' + errMsg(e).split('\n')[0]);
44
+ }
45
+ }
46
+ const keepOff = BOOT_SETTINGS.filter((s) => _.get(ctx.loaded.config, s) === true && _.get(run.config, s) === false);
47
+ return { wants: { projects, keepOff }, notes };
48
+ }