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
@@ -0,0 +1,145 @@
1
+ // Which project of the running sandbox a command is run from. Every command that works on a running sandbox uses
2
+ // these, so they all agree: `locateHere` only looks (attach, sessions, status, restart), `joinHere` also makes the
3
+ // folder a project of the running sandbox when it can without a restart (launch, start, exec, db).
4
+ import path from 'node:path';
5
+ import { select } from '@inquirer/prompts';
6
+ import { describeMissing, missingTip } from '../../../core/local-config/index.js';
7
+ import { askYesNo } from '../../../core/prompt.js';
8
+ import { isInsideOrEqual } from '../../../core/util/index.js';
9
+ import { resolveRun } from '../../../core/run/index.js';
10
+ import { SandboxChannel } from '../../../host/channel/index.js';
11
+ import { ProjectRegistry, joinRunning } from '../../../host/projects/index.js';
12
+ import { c, working } from '../../output/index.js';
13
+ import { describeSessions } from './describe-sessions.js';
14
+ import { guestPathFor } from '../context.js';
15
+ /** The folder the command is about: --workspace, else the current one. */
16
+ export function hereDir(ctx) {
17
+ return path.resolve(ctx.options.workspace ?? process.cwd());
18
+ }
19
+ /** Where this folder is in the running sandbox, if it is in it at all (nothing is registered). */
20
+ export function locateHere(ctx, status) {
21
+ const dir = hereDir(ctx);
22
+ const here = new ProjectRegistry(ctx.storageRoot).here(dir);
23
+ if (here)
24
+ return here;
25
+ // A sandbox started before projects existed: only its launch folder.
26
+ if (!new ProjectRegistry(ctx.storageRoot).read() && status && isInsideOrEqual(status.workspaceHost, dir))
27
+ return { project: null, guestDir: guestPathFor(dir, status.workspaceHost, status.guestWorkspace) };
28
+ return { project: null, guestDir: null };
29
+ }
30
+ let restartedOnce = false;
31
+ /** restart.ts: the sandbox was restarted for a project in this command. */
32
+ export function markRestarted() {
33
+ restartedOnce = true;
34
+ }
35
+ /**
36
+ * Makes this folder a project of the running sandbox (nothing to do for the launch folder and projects already in
37
+ * it): its .sandbox-config.json is approved like at a launch, its protections are checked, and it is made visible.
38
+ * Throws NeedsRestart (host/projects) when that is impossible without a restart.
39
+ */
40
+ export async function joinHere(ctx, status, o = {}) {
41
+ const { options, loaded, packageRoot, storageRoot, dataPath } = ctx;
42
+ const dir = hereDir(ctx);
43
+ // A sandbox started before projects existed: only its launch folder (guestPathFor explains why otherwise).
44
+ if (!new ProjectRegistry(storageRoot).read())
45
+ return {
46
+ project: null,
47
+ guestDir: guestPathFor(dir, status.workspaceHost, status.guestWorkspace),
48
+ spec: null,
49
+ harness: null,
50
+ notes: [],
51
+ };
52
+ let shown = false;
53
+ const joined = await joinRunning({
54
+ storageRoot,
55
+ dataPath,
56
+ packageRoot,
57
+ hostDir: dir,
58
+ wsbShare: loaded.config.projects.wsbShare,
59
+ resolve: (root) => resolveRun({
60
+ packageRoot,
61
+ loaded,
62
+ cwd: root,
63
+ workspace: root,
64
+ harness: options.harness,
65
+ noAgent: options.noAgent,
66
+ noLocalConfig: options.noLocalConfig,
67
+ trustConfig: options.trustConfig,
68
+ scripts: options.scripts,
69
+ databases: options.databases,
70
+ nodeVersion: options.node,
71
+ pythonVersion: options.python,
72
+ ask: askYesNo,
73
+ }),
74
+ // Its own settings are stricter than the sandbox's: --yes or a "yes" in a terminal joins with the sandbox's.
75
+ acceptStricter: async (name, stricter) => {
76
+ if (options.yes)
77
+ return true;
78
+ if (!process.stdin.isTTY || !process.stdout.isTTY)
79
+ return false;
80
+ console.log(c.yellow(name +
81
+ "'s settings are stricter than this sandbox's (they apply to every session in it):\n " +
82
+ stricter.join('\n ')));
83
+ return askYesNo("Join with the sandbox's settings?");
84
+ },
85
+ // Something it wants only comes with a restart: --yes restarts, a terminal asks, anything else continues.
86
+ decide: async (name, missing) => {
87
+ // Once per command: what a restart could not give (see the launch notes) never restarts it again.
88
+ if (o.noRestart || restartedOnce)
89
+ return 'continue';
90
+ if (options.yes)
91
+ return 'restart';
92
+ if (!process.stdin.isTTY || !process.stdout.isTTY)
93
+ return 'continue';
94
+ console.log(c.yellow(describeMissing(name, missing)));
95
+ shown = true;
96
+ const sessions = new SandboxChannel(dataPath).currentSessions();
97
+ const ending = sessions.length ? describeSessions(sessions) + ' will end' : 'no session is running';
98
+ return select({
99
+ message: 'What now?',
100
+ choices: [
101
+ { name: 'Continue anyway (join without them)', value: 'continue' },
102
+ { name: 'Restart with them (' + ending + ')', value: 'restart' },
103
+ { name: 'Cancel', value: 'cancel' },
104
+ ],
105
+ default: 'continue',
106
+ });
107
+ },
108
+ });
109
+ const harness = joined.run && joined.run.harnessName !== 'none' ? joined.run.harnessName : null;
110
+ const notes = joined.missing
111
+ ? [...joined.notes, ...missingNotes(ctx, joined.project.name, joined.project.host, joined.missing, shown)]
112
+ : joined.notes;
113
+ return { project: joined.project, guestDir: joined.guestDir, spec: joined.spec, harness, notes };
114
+ }
115
+ /** The command that restarts the running sandbox with this folder's boot wishes (consent given by --yes). */
116
+ export function restartCommand(ctx, host) {
117
+ const agent = ctx.options.noAgent ? 'start' : (ctx.options.harness ?? ctx.loaded.config.defaultHarness);
118
+ return 'sandbox ' + agent + ' --workspace "' + host + '" --yes';
119
+ }
120
+ /** Joined without what it wants at boot: what is missing, how to restart with it, and how to always have it. */
121
+ export function missingNotes(ctx, name, host, missing, shown = false) {
122
+ return [
123
+ ...(shown ? [] : [c.yellow(describeMissing(name, missing))]),
124
+ 'Joined without them. To restart the sandbox with them (its sessions end): ' + restartCommand(ctx, host),
125
+ c.dim(missingTip(missing)),
126
+ ];
127
+ }
128
+ /** Waits until the sandbox has set a project up, with its progress on a spinner (plain lines without a terminal). */
129
+ export async function provisionJoined(ctx, joined) {
130
+ if (!joined.spec)
131
+ return;
132
+ const spec = joined.spec;
133
+ let step = 'starting';
134
+ await working(() => 'Setting up ' + spec.name + ' in the running sandbox: ' + step, () => new SandboxChannel(ctx.dataPath).prepareProject(spec, (m) => {
135
+ step = m;
136
+ }));
137
+ }
138
+ /** joinHere, then (for another project) waits until the sandbox has set it up. */
139
+ export async function readyHere(ctx, status) {
140
+ const joined = await joinHere(ctx, status);
141
+ for (const note of joined.notes)
142
+ console.log(note);
143
+ await provisionJoined(ctx, joined);
144
+ return joined;
145
+ }
@@ -0,0 +1,4 @@
1
+ export * from './here.js';
2
+ export * from './projects.js';
3
+ export * from './restart.js';
4
+ export * from './describe-sessions.js';
@@ -0,0 +1,4 @@
1
+ export * from './here.js';
2
+ export * from './projects.js';
3
+ export * from './restart.js';
4
+ export * from './describe-sessions.js';
@@ -0,0 +1,14 @@
1
+ import { type Context } from '../context.js';
2
+ interface Row {
3
+ readonly folder: string;
4
+ readonly here: boolean;
5
+ readonly known: boolean;
6
+ readonly root: string | null;
7
+ readonly excluded: boolean;
8
+ readonly mappedAtStart: boolean;
9
+ readonly running: string | null;
10
+ }
11
+ /** Every project worth listing: known ones, the running sandbox's, and this folder. */
12
+ export declare function projectRows(ctx: Context): Row[];
13
+ export declare function projects(ctx: Context): Promise<number>;
14
+ export {};
@@ -0,0 +1,213 @@
1
+ // `sandbox projects`: which projects a sandbox can open without a restart. Project roots (whole folders of projects),
2
+ // the projects this tool has started before, and projects.all / projects.exclude. Changes to what is mapped take
3
+ // effect at the next start; a project you start while a sandbox runs joins it when it can (projects.ts in host/).
4
+ import path from 'node:path';
5
+ import { checkbox } from '@inquirer/prompts';
6
+ import { assertSafeMapping, assertSafeWorkspace } from '../../../core/safe-paths.js';
7
+ import { dirExists, expandPath, fail, isRootPath } from '../../../core/util/index.js';
8
+ import { isSandboxRunning } from '../../../host/sandbox/index.js';
9
+ import { KnownProjects, projectMapper, ProjectRegistry } from '../../../host/projects/index.js';
10
+ import { isWithin } from '../../../shared/paths/index.js';
11
+ import { c, pageSizeFor, shortenMiddle, termWidth, printJson, table } from '../../output/index.js';
12
+ import { hereDir } from './here.js';
13
+ import { addToList, removeFromList, setSetting } from '../user-config.js';
14
+ function settings(ctx) {
15
+ const p = ctx.loaded.config.projects;
16
+ const expand = (list) => list.map((x) => expandPath(x, ctx.loaded.base));
17
+ return { all: p.all, roots: expand(p.roots), exclude: expand(p.exclude) };
18
+ }
19
+ /** Every project worth listing: known ones, the running sandbox's, and this folder. */
20
+ export function projectRows(ctx) {
21
+ const s = settings(ctx);
22
+ const registry = isSandboxRunning() ? new ProjectRegistry(ctx.storageRoot).read() : null;
23
+ const here = hereDir(ctx);
24
+ const known = new KnownProjects(ctx.storageRoot).list();
25
+ const folders = [...known.map((k) => k.host), ...(registry?.projects.map((p) => p.host) ?? [])];
26
+ const unique = folders.filter((f, i) => folders.findIndex((g) => g.toLowerCase() === f.toLowerCase()) === i);
27
+ return unique.map((folder) => {
28
+ const root = s.roots.find((r) => isWithin(r, folder)) ?? null;
29
+ const excluded = s.exclude.some((e) => isWithin(e, folder));
30
+ const inSandbox = registry?.projects.find((p) => p.host.toLowerCase() === folder.toLowerCase());
31
+ return {
32
+ folder,
33
+ here: isWithin(folder, here),
34
+ known: known.some((k) => k.host.toLowerCase() === folder.toLowerCase()),
35
+ root,
36
+ excluded,
37
+ mappedAtStart: root !== null || (s.all && !excluded && dirExists(folder)),
38
+ running: inSandbox ? inSandbox.name + ' (' + inSandbox.mechanism + ')' : null,
39
+ };
40
+ });
41
+ }
42
+ const NEXT_START = 'This changes what is mapped from the next start.';
43
+ function runningNote() {
44
+ return isSandboxRunning()
45
+ ? ' The running sandbox keeps what it has; start a project in it (sandbox claude there) and it joins without a restart when it can, or you are offered one.'
46
+ : '';
47
+ }
48
+ /** A folder for roots: it holds projects, so it must pass the same checks as a workspace and must not be a drive. */
49
+ function checkFolder(ctx, folder, what) {
50
+ const dir = path.resolve(folder);
51
+ if (!dirExists(dir))
52
+ fail('The folder ' + dir + ' does not exist.', 'Check the path.');
53
+ if (isRootPath(dir))
54
+ fail('A whole drive cannot be ' + what + ': ' + dir, 'Use the folder that holds your projects, e.g. F:\\Code.');
55
+ assertSafeWorkspace(dir, ctx.packageRoot, ctx.storageRoot);
56
+ assertSafeMapping(dir, ctx.packageRoot, ctx.storageRoot);
57
+ return dir;
58
+ }
59
+ function list(ctx) {
60
+ const rows = projectRows(ctx);
61
+ const s = settings(ctx);
62
+ if (printJson(ctx, { all: s.all, roots: s.roots, exclude: s.exclude, projects: rows }))
63
+ return 0;
64
+ console.log(c.bold('projects.all') +
65
+ ': ' +
66
+ (s.all ? 'on (every project below is mapped at every start, except excluded ones)' : 'off') +
67
+ c.dim(' sandbox projects all on|off'));
68
+ console.log(c.bold('Roots') +
69
+ ': ' +
70
+ (s.roots.length ? s.roots.join(', ') : c.dim('none (sandbox projects roots add <folder>)')));
71
+ if (!rows.length) {
72
+ console.log('No projects yet: start one with sandbox claude in its folder.');
73
+ return 0;
74
+ }
75
+ const width = Math.max(20, termWidth() - 46);
76
+ table([
77
+ ['', 'FOLDER', 'AT START', 'RUNNING SANDBOX'],
78
+ ...rows.map((r) => [
79
+ r.here ? '*' : '',
80
+ shortenMiddle(r.folder, width),
81
+ r.root ? 'root' : r.excluded ? 'excluded' : r.mappedAtStart ? 'mapped' : '-',
82
+ r.running ?? '-',
83
+ ]),
84
+ ]);
85
+ console.log(c.dim('* = this folder. Choose with: sandbox projects choose'));
86
+ return 0;
87
+ }
88
+ /** Ticks the projects mapped at every start (turns projects.all on when any is ticked); the rest are excluded. */
89
+ async function choose(ctx) {
90
+ const rows = projectRows(ctx).filter((r) => !r.root);
91
+ if (!rows.length) {
92
+ console.log('No projects to choose from yet (projects in a root are always mapped with it). Start one with sandbox claude in its folder.');
93
+ return 0;
94
+ }
95
+ if (!process.stdin.isTTY)
96
+ fail('sandbox projects choose needs an interactive terminal.', 'Use sandbox projects include|exclude <folder> instead.');
97
+ const s = settings(ctx);
98
+ const picked = await checkbox({
99
+ message: 'Projects mapped at every start, so they open without a restart (every agent in the sandbox can see them):',
100
+ pageSize: pageSizeFor(rows.length),
101
+ choices: rows.map((r) => ({
102
+ value: r.folder,
103
+ name: shortenMiddle(r.folder, termWidth() - 12) + (r.here ? c.dim(' (this folder)') : ''),
104
+ checked: s.all && !r.excluded,
105
+ })),
106
+ });
107
+ const exclude = rows.filter((r) => !picked.includes(r.folder)).map((r) => r.folder);
108
+ setSetting(ctx, ['projects', 'exclude'], [...s.exclude.filter((e) => !rows.some((r) => r.folder.toLowerCase() === e.toLowerCase())), ...exclude]);
109
+ setSetting(ctx, ['projects', 'all'], picked.length > 0);
110
+ console.log(picked.length + ' project(s) mapped at every start, ' + exclude.length + ' excluded. ' + NEXT_START + runningNote());
111
+ return 0;
112
+ }
113
+ function add(ctx, value) {
114
+ const dir = checkFolder(ctx, value, 'a project');
115
+ new KnownProjects(ctx.storageRoot).remember(dir);
116
+ console.log('Added ' +
117
+ dir +
118
+ ' to your projects.' +
119
+ (settings(ctx).all
120
+ ? ' ' + NEXT_START
121
+ : ' It is mapped at every start once projects.all is on (sandbox projects all on).'));
122
+ return 0;
123
+ }
124
+ function remove(ctx, value) {
125
+ const dir = path.resolve(value);
126
+ const forgot = new KnownProjects(ctx.storageRoot).forget(dir);
127
+ // The running sandbox forgets it too (its folder stays visible until the sandbox stops, if it was mapped).
128
+ const registered = isSandboxRunning()
129
+ ? new ProjectRegistry(ctx.storageRoot)
130
+ .read()
131
+ ?.projects.find((p) => !p.primary && p.host.toLowerCase() === dir.toLowerCase())
132
+ : undefined;
133
+ if (registered)
134
+ projectMapper({ storageRoot: ctx.storageRoot, packageRoot: ctx.packageRoot, wsbShare: false }).unregister(registered.name);
135
+ console.log(forgot || registered
136
+ ? 'Removed ' + dir + ' from your projects (nothing in the folder was touched).'
137
+ : dir + ' was not in your projects.');
138
+ return 0;
139
+ }
140
+ function includeOrExclude(ctx, action, value) {
141
+ const dir = path.resolve(value);
142
+ const changed = action === 'exclude'
143
+ ? addToList(ctx, ['projects', 'exclude'], dir)
144
+ : removeFromList(ctx, ['projects', 'exclude'], dir);
145
+ if (action === 'include')
146
+ new KnownProjects(ctx.storageRoot).remember(dir);
147
+ console.log((changed ? (action === 'exclude' ? 'Excluded ' : 'Included ') + dir + '. ' + NEXT_START : 'Nothing changed.') +
148
+ (action === 'include' && !settings(ctx).all
149
+ ? ' projects.all is off: sandbox projects all on maps your projects at every start.'
150
+ : '') +
151
+ (changed ? runningNote() : ''));
152
+ return 0;
153
+ }
154
+ function all(ctx, value) {
155
+ if (value === undefined) {
156
+ console.log('projects.all is ' + (settings(ctx).all ? 'on' : 'off') + '.');
157
+ return 0;
158
+ }
159
+ setSetting(ctx, ['projects', 'all'], value === 'on');
160
+ console.log('projects.all is ' +
161
+ value +
162
+ '. ' +
163
+ NEXT_START +
164
+ (value === 'on' ? ' Every agent in the sandbox can then see all of those projects.' : '') +
165
+ runningNote());
166
+ return 0;
167
+ }
168
+ function roots(ctx, value, folder) {
169
+ if (!value || value === 'list') {
170
+ const list = settings(ctx).roots;
171
+ console.log(list.length ? list.join('\n') : 'No project roots. Add one: sandbox projects roots add <folder>');
172
+ return 0;
173
+ }
174
+ if (value === 'add') {
175
+ const dir = checkFolder(ctx, folder, 'a project root');
176
+ const added = addToList(ctx, ['projects', 'roots'], dir);
177
+ console.log(added
178
+ ? 'Added the project root ' +
179
+ dir +
180
+ ': every project in it (also new ones) opens without a restart. Every agent in the sandbox can see all of them. ' +
181
+ NEXT_START +
182
+ runningNote()
183
+ : dir + ' is a root already.');
184
+ return 0;
185
+ }
186
+ const dir = path.resolve(folder);
187
+ console.log(removeFromList(ctx, ['projects', 'roots'], dir)
188
+ ? 'Removed the project root ' + dir + '. ' + NEXT_START
189
+ : dir + ' was not a root.');
190
+ return 0;
191
+ }
192
+ export async function projects(ctx) {
193
+ const [action = 'list', value, folder] = ctx.options.positionals;
194
+ switch (action) {
195
+ case 'list':
196
+ return list(ctx);
197
+ case 'choose':
198
+ return choose(ctx);
199
+ case 'add':
200
+ return add(ctx, value);
201
+ case 'remove':
202
+ return remove(ctx, value);
203
+ case 'include':
204
+ case 'exclude':
205
+ return includeOrExclude(ctx, action, value);
206
+ case 'all':
207
+ return all(ctx, value);
208
+ case 'roots':
209
+ return roots(ctx, value, folder);
210
+ default:
211
+ return fail('Unknown projects action "' + action + '".');
212
+ }
213
+ }
@@ -0,0 +1,15 @@
1
+ import type { SandboxStatus } from '../../../core/types.js';
2
+ import { type NeedsRestart } from '../../../host/projects/index.js';
3
+ import type { Context } from '../context.js';
4
+ import type { LaunchExtras, OpenSessionOptions } from '../launch/index.js';
5
+ import { type Joined } from './here.js';
6
+ /** What a restart needs from launch (launch imports this file, so it is handed in rather than imported). */
7
+ export interface Relauncher {
8
+ launch(ctx: Context, generateOnly: boolean, extras: LaunchExtras): Promise<number>;
9
+ readySandbox(dataPath: string): Promise<SandboxStatus>;
10
+ joinHere(ctx: Context, status: SandboxStatus, o?: {
11
+ noRestart?: boolean;
12
+ }): Promise<Joined>;
13
+ openSession(ctx: Context, ready: SandboxStatus, joined: Joined, o: OpenSessionOptions): Promise<number>;
14
+ }
15
+ export declare function offerRestart(ctx: Context, needs: NeedsRestart[], then: () => Promise<number>, relauncher: Relauncher): Promise<number>;
@@ -0,0 +1,149 @@
1
+ // The last way in for a folder the running sandbox cannot show (not in a project root, no `wsb share`): restart it
2
+ // with that folder mapped as well. Only ever with your consent (a prompt, or --yes): it lists what will end, stops
3
+ // the sandbox cleanly (history and claude-mem sync back as on any close), starts it again from the same launch
4
+ // folder with the projects it had plus the new one, reopens the sessions it ended (continuing their conversations
5
+ // where the agent supports it) and then starts the new project's session.
6
+ import path from 'node:path';
7
+ import _ from 'lodash';
8
+ import { askYesNo } from '../../../core/prompt.js';
9
+ import { missingTip } from '../../../core/local-config/index.js';
10
+ import { fail, sleep } from '../../../core/util/index.js';
11
+ import { SandboxChannel } from '../../../host/channel/index.js';
12
+ import { isSandboxRunning } from '../../../host/sandbox/index.js';
13
+ import { ProjectRegistry } from '../../../host/projects/index.js';
14
+ import { hostDirFor, projectForGuestDir } from '../../../shared/paths/index.js';
15
+ import { RunDir } from '../../../shared/channel/index.js';
16
+ import { watcherRunning } from '../../../sync/index.js';
17
+ import { c, working } from '../../output/index.js';
18
+ import { markRestarted } from './here.js';
19
+ import { describeSessions } from './describe-sessions.js';
20
+ /** The command to run again with consent, for a non-interactive terminal. */
21
+ function againWithYes(ctx) {
22
+ return ('sandbox ' +
23
+ (ctx.options.noAgent ? 'start' : (ctx.options.harness ?? ctx.loaded.config.defaultHarness)) +
24
+ (ctx.options.terminal ? ' -t' : '') +
25
+ ' --yes');
26
+ }
27
+ /** Where each running session is on this PC, so it can be reopened after the restart. */
28
+ function sessionsToReopen(registry, sessions) {
29
+ return sessions.flatMap((s) => {
30
+ const project = projectForGuestDir([...registry.projects, ...registry.roots.map((r) => ({ ...r }))], s.cwd);
31
+ return project ? [{ harness: s.harness, hostDir: hostDirFor(project, s.cwd) }] : [];
32
+ });
33
+ }
34
+ /** Shuts the sandbox down and waits until it (and the background sync's final pass) is gone. */
35
+ async function stopAndWait(ctx) {
36
+ const status = new RunDir(ctx.dataPath).readSandboxStatus();
37
+ await working('Stopping the sandbox (history syncs back)', async () => {
38
+ await new SandboxChannel(ctx.dataPath)
39
+ .exec(['C:\\Windows\\System32\\shutdown.exe', '/s', '/t', '0'], status?.guestWorkspace ?? 'C:\\', 30)
40
+ .catch(() => null);
41
+ for (let i = 0; i < 180 && isSandboxRunning(); i++)
42
+ await sleep(1000);
43
+ if (isSandboxRunning())
44
+ fail('The sandbox did not shut down within 3 minutes.', 'Close its window yourself, then run the command again.');
45
+ // The watcher syncs history back a few seconds after the window closes; the next start needs it gone.
46
+ for (let i = 0; i < 60 && watcherRunning(ctx.dataPath); i++)
47
+ await sleep(1000);
48
+ });
49
+ }
50
+ /** The same command for another folder, as a plain new session (nothing attached, no agent arguments). */
51
+ function freshContext(ctx, workspace, harness, more = {}) {
52
+ return {
53
+ ...ctx,
54
+ options: {
55
+ ...ctx.options,
56
+ workspace,
57
+ harness,
58
+ terminal: false,
59
+ newSession: true,
60
+ passthrough: [],
61
+ sessions: [],
62
+ ...more,
63
+ },
64
+ };
65
+ }
66
+ /**
67
+ * Says what a restart maps, keeps and ends. `hidden`: the folders the running sandbox cannot show; a project that only
68
+ * wants boot settings or folders is not among them (you already chose the restart, or gave --yes, when asked).
69
+ */
70
+ function explain(needs, hidden, registry, sessions) {
71
+ for (const need of hidden)
72
+ console.log(c.yellow('Windows Sandbox cannot add ' + need.hostDir + ' while it runs: ' + need.reason + '.'));
73
+ console.log((hidden.length
74
+ ? 'A restart maps ' + (hidden.length === 1 ? 'it' : 'them') + ' as well'
75
+ : 'Restarting with what ' + needs.map((n) => path.basename(n.hostDir)).join(', ') + ' wants') +
76
+ ' (and keeps ' +
77
+ registry.projects.map((p) => p.host).join(', ') +
78
+ '). ' +
79
+ (sessions.length ? describeSessions(sessions) + ' will end' : 'No session is running') +
80
+ '; your files, tools, databases and logins are kept. It takes about a minute.');
81
+ for (const parent of _.uniq(hidden.map((n) => path.dirname(n.hostDir))))
82
+ console.log(c.dim('No restart next time for folders in ' + parent + ': sandbox projects roots add "' + parent + '"'));
83
+ for (const need of needs)
84
+ if (need.missing)
85
+ console.log(c.dim(missingTip(need.missing)));
86
+ }
87
+ /** --yes, or a yes at the prompt; without a terminal to ask in, it fails with the command to run. */
88
+ async function consented(ctx) {
89
+ if (ctx.options.yes)
90
+ return true;
91
+ const interactive = Boolean(process.stdin.isTTY && process.stdout.isTTY);
92
+ if (!interactive)
93
+ fail('Not restarting without your consent.', 'Run it again with --yes to restart: ' + againWithYes(ctx));
94
+ return askYesNo('Restart the sandbox now?');
95
+ }
96
+ /** Reopens each session the restart ended, continuing its conversation where the agent supports it. */
97
+ async function reopenSessions(ctx, ready, reopen, relauncher) {
98
+ for (const s of reopen) {
99
+ const at = freshContext(ctx, s.hostDir, s.harness);
100
+ try {
101
+ const joined = await relauncher.joinHere(at, ready, { noRestart: true });
102
+ for (const note of joined.notes)
103
+ console.log(note);
104
+ await relauncher.openSession(at, ready, joined, {
105
+ attach: false,
106
+ harness: s.harness,
107
+ args: ctx.loaded.config.harnesses[s.harness]?.resumeArguments ?? [],
108
+ reuse: false,
109
+ });
110
+ }
111
+ catch (e) {
112
+ console.warn(c.yellow('Could not reopen ' + s.harness + ' in ' + s.hostDir + ': ' + (e instanceof Error ? e.message : String(e))));
113
+ }
114
+ }
115
+ }
116
+ export async function offerRestart(ctx, needs, then, relauncher) {
117
+ const folders = needs.map((n) => n.hostDir);
118
+ const registry = new ProjectRegistry(ctx.storageRoot).read() ??
119
+ fail('The running sandbox was started by an older version, so it cannot take another folder.', 'Stop it (sandbox stop) and start it again from ' + folders[0] + '.');
120
+ const primary = registry.projects.find((p) => p.primary) ??
121
+ fail('The running sandbox has no launch folder on record.', 'Stop it (sandbox stop) and start it again.');
122
+ const sessions = new SandboxChannel(ctx.dataPath).currentSessions();
123
+ const hidden = needs.filter((n) => !n.missing);
124
+ explain(needs, hidden, registry, sessions);
125
+ if (hidden.length && !(await consented(ctx))) {
126
+ console.log('Nothing changed.');
127
+ return 1;
128
+ }
129
+ const reopen = sessionsToReopen(registry, sessions);
130
+ const resume = reopen.length > 0 &&
131
+ (ctx.options.yes ||
132
+ (await askYesNo('Reopen the ' +
133
+ reopen.length +
134
+ ' session(s) afterwards (continuing their conversations where the agent supports it)?', true)));
135
+ await stopAndWait(ctx);
136
+ markRestarted();
137
+ const keep = registry.projects.filter((p) => !p.primary && p.mechanism !== 'root').map((p) => p.host);
138
+ const harness = ctx.options.harness ?? ctx.options.sessions[0]?.harness;
139
+ const relaunch = freshContext(ctx, primary.host, harness, { noAgent: false });
140
+ await relauncher.launch(relaunch, false, {
141
+ extraProjects: [...keep, ...folders],
142
+ autoSession: false,
143
+ waitUntilReady: true,
144
+ });
145
+ const ready = await relauncher.readySandbox(ctx.dataPath);
146
+ if (resume)
147
+ await reopenSessions(ctx, ready, reopen, relauncher);
148
+ return then();
149
+ }
@@ -0,0 +1,3 @@
1
+ import type { Context } from './context.js';
2
+ export type Handler = (ctx: Context) => number | Promise<number | void>;
3
+ export declare const HANDLERS: Readonly<Partial<Record<string, Handler>>>;
@@ -0,0 +1,34 @@
1
+ import { launch } from './launch/index.js';
2
+ import { setup } from './setup/index.js';
3
+ import { data } from './data/index.js';
4
+ import { attach, db, exec, hide, restart, sessions, show, status, stop } from './sessions/index.js';
5
+ import { account } from './accounts.js';
6
+ import { projects } from './projects/index.js';
7
+ import { audit, claudeHost, clean, config, doctor, logs, sync, watcher } from './maintenance/index.js';
8
+ import { agentCommandsCommand } from './agent-commands.js';
9
+ export const HANDLERS = {
10
+ launch: (ctx) => launch(ctx),
11
+ generate: (ctx) => launch(ctx, true),
12
+ attach: attach,
13
+ sessions: sessions,
14
+ status: status,
15
+ exec: exec,
16
+ 'agent-commands': agentCommandsCommand,
17
+ db: db,
18
+ restart: restart,
19
+ stop: stop,
20
+ show: show,
21
+ hide: hide,
22
+ account: account,
23
+ projects: projects,
24
+ sync: sync,
25
+ logs: logs,
26
+ audit: audit,
27
+ clean: clean,
28
+ config: config,
29
+ doctor: doctor,
30
+ setup: setup,
31
+ data: data,
32
+ 'host-claude': claudeHost,
33
+ _watch: watcher,
34
+ };