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
@@ -0,0 +1,218 @@
1
+ // A sandbox that is already running: wait for it, open sessions in it, attach this terminal to one.
2
+ import _ from 'lodash';
3
+ import { attachTerminal, findUnwatchedSession, SandboxChannel } from '../../../host/channel/index.js';
4
+ import { insideSandbox, hideSandboxWindow, showSandboxWindow } from '../../../host/sandbox/index.js';
5
+ import { NeedsRestart } from '../../../host/projects/index.js';
6
+ import { RunDir } from '../../../shared/channel/index.js';
7
+ import { errMsg, fail, sleep } from '../../../core/util/index.js';
8
+ import { c, follow, working, table } from '../../output/index.js';
9
+ import { bootLine, readyIn, stillWorking } from './boot-progress.js';
10
+ import { hereDir, joinHere, readyHere, offerRestart } from '../projects/index.js';
11
+ /** How long a session may take to start (its project's setup, the agent's install). */
12
+ const SESSION_START_MS = 60 * 60 * 1000;
13
+ /**
14
+ * Attaches this terminal; with attach.autoHide the sandbox window hides meanwhile (best effort, never fails the
15
+ * attach).
16
+ */
17
+ export function attachHere(ctx, session) {
18
+ if (ctx.loaded.config.attach.autoHide && !insideSandbox())
19
+ void hideSandboxWindow(ctx.storageRoot, 120).catch(() => false);
20
+ return attachTerminal(session);
21
+ }
22
+ /** The sandbox writes sandbox.json a few seconds into its boot; a second launch right after the first waits for it. */
23
+ export async function runningSandboxStatus(dataPath) {
24
+ const run = new RunDir(dataPath);
25
+ for (let i = 0; i < 60; i++) {
26
+ const status = run.readSandboxStatus();
27
+ if (status)
28
+ return status;
29
+ await sleep(1000);
30
+ }
31
+ return fail('A Windows Sandbox is running that this tool did not start (or that uses another storage.dataName).', 'Close that sandbox window first, then run sandbox claude again.');
32
+ }
33
+ /**
34
+ * Waits for the boot with its current step and what it sets up on one line (plain lines without a terminal).
35
+ * timed: say how long it took (a first start, where that is worth knowing).
36
+ */
37
+ export async function waitForBoot(dataPath, launchId, timed = false) {
38
+ let status = null;
39
+ const start = Date.now();
40
+ const ready = await follow(() => bootLine(status), () => new SandboxChannel(dataPath).waitForReady(launchId, () => undefined, (s) => {
41
+ if (s.phase !== 'failed')
42
+ status = s;
43
+ }), { stall: stillWorking });
44
+ if (timed)
45
+ console.log(readyIn(Date.now() - start));
46
+ return ready;
47
+ }
48
+ /** The running sandbox, once it is ready. */
49
+ export async function readySandbox(dataPath) {
50
+ const status = await runningSandboxStatus(dataPath);
51
+ return status.phase === 'ready' ? status : waitForBoot(dataPath, status.launchId);
52
+ }
53
+ /** Waits for a session to start (its project's setup, the agent's install) with its progress on a spinner. */
54
+ export function waitForStart(ctx, requestId, what) {
55
+ let step = 'starting';
56
+ const shown = () => ({ line: what + ': ' + step, key: step, what: step });
57
+ return follow(shown, () => new SandboxChannel(ctx.dataPath).waitForSession(requestId, SESSION_START_MS, (m) => {
58
+ step = m;
59
+ }), { stall: stillWorking });
60
+ }
61
+ /** Asks the sandbox for a session; the agent's definition goes along (the sandbox may have booted with another). */
62
+ function requestSession(ctx, channel, harness, args, joined) {
63
+ const harnessSpec = ctx.loaded.config.harnesses[harness];
64
+ return channel.requestSession(harness, args, joined.guestDir, {
65
+ ...(joined.spec ? { project: joined.spec } : {}),
66
+ ...(harnessSpec ? { harnessSpec } : {}),
67
+ });
68
+ }
69
+ /**
70
+ * Starts (or picks back up) a session in the folder `joined` describes. attach: show it in this terminal.
71
+ * Exported for restart.ts, which reopens the sessions a restart ended.
72
+ */
73
+ export async function openSession(ctx, ready, joined, o) {
74
+ const { options, loaded, dataPath } = ctx;
75
+ const cwd = joined.guestDir;
76
+ const harness = o.harness ?? options.harness ?? joined.harness ?? loaded.config.defaultHarness;
77
+ const args = o.args ?? options.passthrough;
78
+ // -t with nothing new for the agent: pick up this folder's session if no terminal on this PC shows it (its tab was
79
+ // closed, or you detached). Someone already attached, --new, or agent arguments: a new session, as before.
80
+ const reuse = (o.reuse ?? true) && o.attach && !options.newSession && args.length === 0 && loaded.config.attach.reuseSession;
81
+ const existing = reuse ? await findUnwatchedSession(dataPath, harness, cwd) : null;
82
+ if (existing) {
83
+ console.log('Reattaching to ' +
84
+ harness +
85
+ ' session ' +
86
+ existing.id +
87
+ ' in ' +
88
+ cwd +
89
+ ' (no other terminal is attached; --new starts another).');
90
+ return attachHere(ctx, existing);
91
+ }
92
+ console.log(joined.spec
93
+ ? 'Starting ' +
94
+ harness +
95
+ ' for ' +
96
+ joined.project?.host +
97
+ ' in the running sandbox (' +
98
+ cwd +
99
+ '; the first time sets up what it needs).'
100
+ : 'Sandbox already running: starting another ' + harness + ' session in ' + cwd);
101
+ const requestId = requestSession(ctx, new SandboxChannel(dataPath), harness, args, joined);
102
+ const session = await waitForStart(ctx, requestId, 'Starting ' + harness + ' in ' + cwd);
103
+ if (o.attach)
104
+ return attachHere(ctx, session);
105
+ console.log('Session ' +
106
+ session.id +
107
+ ' opened in a new tab inside the sandbox. Attach here with: sandbox attach ' +
108
+ session.id +
109
+ (ready.headless ? ' (headless: sbx-show opens the window)' : ''));
110
+ return 0;
111
+ }
112
+ /** The sessions a launch asks for: each --session, else one (the agent, in this folder). */
113
+ function wantedSessions(ctx) {
114
+ return ctx.options.sessions.length ? ctx.options.sessions : [{ harness: ctx.options.harness, folder: hereDir(ctx) }];
115
+ }
116
+ /** The same command, for one of its sessions (its folder, agent, and the arguments after -- plus its own). */
117
+ export function contextFor(ctx, want) {
118
+ return {
119
+ ...ctx,
120
+ options: {
121
+ ...ctx.options,
122
+ workspace: want.folder,
123
+ harness: want.harness,
124
+ sessions: [],
125
+ passthrough: [...ctx.options.passthrough, ...(want.args ?? [])],
126
+ },
127
+ };
128
+ }
129
+ /**
130
+ * Several sessions at once: all requested together (projects set up in parallel), then listed; -t attaches the first.
131
+ */
132
+ async function openSessions(ctx, ready, list) {
133
+ const { loaded, options } = ctx;
134
+ const channel = new SandboxChannel(ctx.dataPath);
135
+ const requests = list.map(({ ctx: at, joined }) => {
136
+ const harness = at.options.harness ?? joined.harness ?? loaded.config.defaultHarness;
137
+ const id = requestSession(ctx, channel, harness, at.options.passthrough, joined);
138
+ return { id, harness, folder: at.options.workspace ?? joined.guestDir, cwd: joined.guestDir };
139
+ });
140
+ let started = 0;
141
+ const results = await working(() => 'Starting ' + requests.length + ' sessions (' + started + ' running)', () => Promise.allSettled(requests.map(async (r) => {
142
+ const s = await channel.waitForSession(r.id, SESSION_START_MS, () => undefined);
143
+ started++;
144
+ return s;
145
+ })));
146
+ table([
147
+ ['SESSION', 'AGENT', 'FOLDER', ''],
148
+ ...requests.map((r, i) => {
149
+ const result = results[i];
150
+ return [
151
+ r.id,
152
+ r.harness,
153
+ r.folder,
154
+ result.status === 'fulfilled' ? 'running sandbox attach ' + r.id : c.red('FAILED: ' + errMsg(result.reason)),
155
+ ];
156
+ }),
157
+ ]);
158
+ const first = results.find((r) => r.status === 'fulfilled');
159
+ if (options.terminal && first)
160
+ return attachHere(ctx, first.value);
161
+ if (!first)
162
+ return 1;
163
+ console.log('Each has its own tab inside the sandbox' +
164
+ (ready.headless ? ' (headless: sbx-show opens the window)' : '') +
165
+ '. Attach to any of them, from any terminal: sandbox attach');
166
+ return results.every((r) => r.status === 'fulfilled') ? 0 : 1;
167
+ }
168
+ /** A sandbox is already running: open the sessions in it (new tabs inside; optionally attach here). */
169
+ export async function launchIntoRunning(ctx, relauncher) {
170
+ const ready = await readySandbox(ctx.dataPath);
171
+ // Every folder joins first: when one needs a restart, nothing has been started that the restart would end.
172
+ const joined = [];
173
+ const needs = [];
174
+ for (const want of wantedSessions(ctx)) {
175
+ const at = ctx.options.sessions.length ? contextFor(ctx, want) : ctx;
176
+ try {
177
+ joined.push({ ctx: at, joined: await joinHere(at, ready) });
178
+ }
179
+ catch (e) {
180
+ if (!(e instanceof NeedsRestart))
181
+ throw e;
182
+ if (!needs.some((n) => n.hostDir.toLowerCase() === e.hostDir.toLowerCase()))
183
+ needs.push(e);
184
+ }
185
+ }
186
+ if (needs.length)
187
+ return offerRestart(ctx, needs, () => launchIntoRunning(ctx, relauncher), relauncher);
188
+ for (const note of _.uniq(joined.flatMap((j) => j.joined.notes)))
189
+ console.log(note);
190
+ if (joined.length === 1)
191
+ return openSession(joined[0].ctx, ready, joined[0].joined, { attach: ctx.options.terminal });
192
+ return openSessions(ctx, ready, joined);
193
+ }
194
+ /** `sandbox start` while one runs: this folder joins it (set up, no agent), or a restart that adds it is offered. */
195
+ export async function startIntoRunning(ctx, relauncher) {
196
+ const ready = await readySandbox(ctx.dataPath);
197
+ let joined;
198
+ try {
199
+ joined = await readyHere(ctx, ready);
200
+ }
201
+ catch (e) {
202
+ if (e instanceof NeedsRestart)
203
+ return offerRestart(ctx, [e], () => startIntoRunning(ctx, relauncher), relauncher);
204
+ throw e;
205
+ }
206
+ const where = joined.spec
207
+ ? ' This folder is ready in it as ' +
208
+ joined.guestDir +
209
+ ' (sbx-shell ' +
210
+ joined.spec.name +
211
+ ' opens a terminal there inside).'
212
+ : '';
213
+ console.log('A sandbox is already running' +
214
+ (showSandboxWindow(ctx.storageRoot) ? '; its window is in front now.' : '.') +
215
+ where +
216
+ ' Start an agent in it with sandbox claude (or sandbox <agent>); stop it with sandbox stop.');
217
+ return 0;
218
+ }
@@ -0,0 +1,8 @@
1
+ import type { Generated, ResolvedRun } from '../../../core/types.js';
2
+ import type { Prepared } from './prepare.js';
3
+ /** What generateSandbox returned. */
4
+ export type GeneratedSandbox = Generated & {
5
+ readonly personalization: string;
6
+ };
7
+ /** The launch summary rows, in the order they are printed. */
8
+ export declare function launchSummary(run: ResolvedRun, generated: GeneratedSandbox, prepared: Prepared | null): string[][];
@@ -0,0 +1,98 @@
1
+ function agentRow(run, generated, prepared) {
2
+ const { config } = run;
3
+ // What the sandbox boots with (the launch folder's settings plus what the other projects at boot want).
4
+ const booted = generated.bootConfig;
5
+ return (run.harnessName +
6
+ (prepared?.account ? ' (account: ' + prepared.account + ')' : '') +
7
+ ' Memory: ' +
8
+ generated.memoryMb +
9
+ ' MB CPU: ' +
10
+ (config.sandbox.cpuLimit === 'none' ? 'all' : 'max ' + config.sandbox.cpuLimit + '%') +
11
+ ' Network: ' +
12
+ booted.sandbox.networking +
13
+ (booted.sandbox.vGpu ? ' vGPU' : '') +
14
+ (config.sandbox.headless ? ' HEADLESS' : ''));
15
+ }
16
+ function versionsRow(run) {
17
+ const { node, python } = run.versions;
18
+ return node.spec + ' (' + node.source + ') Python: ' + python.spec + ' (' + python.source + ')';
19
+ }
20
+ function preparedRows(prepared) {
21
+ return prepared
22
+ ? [
23
+ ['Ignored files', prepared.filter],
24
+ ['Terminal', prepared.terminal],
25
+ ['History', prepared.history],
26
+ ['Cleanup', prepared.pruned],
27
+ ]
28
+ : [];
29
+ }
30
+ function toolchainsRow(generated) {
31
+ return (Object.entries(generated.toolchains)
32
+ .filter(([, d]) => d.on)
33
+ .map(([name, d]) => name + ' (' + d.reason + ')')
34
+ .join(', ') || 'Node only (nothing else used by this project)');
35
+ }
36
+ function databaseRows(generated) {
37
+ if (!generated.databases.length)
38
+ return [['Databases', 'none needed (databases.<name>.enabled = true adds one)']];
39
+ return generated.databases.map((d, i) => [
40
+ i ? '' : 'Databases',
41
+ d.database +
42
+ (d.database === 'sqlserver'
43
+ ? ' (cannot run in the sandbox; use Postgres or SQLite for local work)'
44
+ : ' on port ' + d.port) +
45
+ ' because ' +
46
+ d.reasons[0] +
47
+ (d.reasons.length > 1 ? ' (+' + (d.reasons.length - 1) + ' more)' : ''),
48
+ ]);
49
+ }
50
+ function claudeRow(generated) {
51
+ const { profile } = generated;
52
+ return profile.staged.length
53
+ ? profile.staged.join(', ') + (profile.credentials ? ' (INCLUDING YOUR LOGIN)' : '')
54
+ : 'no settings copied';
55
+ }
56
+ function secretsRow(run, generated) {
57
+ if (!run.config.secrets.strip)
58
+ return 'NOT stripped (secrets.strip is off)';
59
+ const removed = generated.profile.secretsRemoved;
60
+ return removed.length
61
+ ? 'kept on this PC: ' + removed.join(', ') + ' (secrets.allow lets one through)'
62
+ : 'none found in what is copied';
63
+ }
64
+ /** Project roots, boot-mapped projects, then any other folder mapped (not the tool's own nor the workspace). */
65
+ function mappingRows(run, generated) {
66
+ const { roots, projects } = generated.projects;
67
+ return [
68
+ ...roots.map((r, i) => [
69
+ i ? '' : 'Project roots',
70
+ r.host + ' -> ' + r.guest + ' (every project in it opens without a restart)',
71
+ ]),
72
+ ...projects.map((p, i) => [i ? '' : 'Projects', p.host + ' -> ' + p.guest]),
73
+ ...generated.mappings
74
+ .slice(2)
75
+ .filter((m) => m.guest !== run.config.guestWorkspace && ![...roots, ...projects].some((p) => p.guest === m.guest))
76
+ .map((m) => [
77
+ ' map ' + (m.readOnly ? 'ro' : 'rw'),
78
+ m.host + ' -> ' + m.guest + (m.label ? ' (' + m.label + ')' : ''),
79
+ ]),
80
+ ];
81
+ }
82
+ /** The launch summary rows, in the order they are printed. */
83
+ export function launchSummary(run, generated, prepared) {
84
+ const { config } = run;
85
+ return [
86
+ ['Workspace', run.workspaceHost + ' -> ' + config.guestWorkspace + (config.readOnly ? ' (read-only)' : '')],
87
+ ['Agent', agentRow(run, generated, prepared)],
88
+ ['Node', versionsRow(run)],
89
+ ...preparedRows(prepared),
90
+ ['Toolchains', toolchainsRow(generated)],
91
+ ...databaseRows(generated),
92
+ ['Desktop', generated.personalization],
93
+ ['Claude', claudeRow(generated)],
94
+ ['Secrets', secretsRow(run, generated)],
95
+ ...mappingRows(run, generated),
96
+ ['Generated', generated.wsbPath],
97
+ ];
98
+ }
@@ -0,0 +1,3 @@
1
+ import { type Context } from '../context.js';
2
+ /** `sandbox audit`: the audit log of the last days (audit.enabled), newest last. */
3
+ export declare function audit(ctx: Context): Promise<number>;
@@ -0,0 +1,58 @@
1
+ import path from 'node:path';
2
+ import { fail, plainText } from '../../../core/util/index.js';
3
+ import { humanBytes } from '../../../core/disk.js';
4
+ import { AuditLog } from '../../../host/audit/log.js';
5
+ import { printJson, c } from '../../output/index.js';
6
+ const KINDS = ['proc', 'file', 'session', 'guard', 'note'];
7
+ const KIND_LABEL = {
8
+ proc: 'program',
9
+ file: 'file',
10
+ session: 'session',
11
+ guard: 'GUARD',
12
+ note: 'note',
13
+ };
14
+ /** `sandbox audit`: the audit log of the last days (audit.enabled), newest last. */
15
+ export async function audit(ctx) {
16
+ const settings = ctx.loaded.config.audit;
17
+ const kind = ctx.options.kind;
18
+ if (kind && !KINDS.includes(kind))
19
+ fail('Unknown kind "' + kind + '".', 'Use one of: ' + KINDS.join(', '));
20
+ const log = new AuditLog(AuditLog.dirFor(ctx.storageRoot, ctx.dataPath), settings);
21
+ const events = log.read({
22
+ days: ctx.options.days,
23
+ kinds: kind ? [kind] : undefined,
24
+ grep: ctx.options.grep,
25
+ });
26
+ if (printJson(ctx, events))
27
+ return 0;
28
+ if (!events.length) {
29
+ console.log(settings.enabled
30
+ ? 'Nothing in the audit log for the last ' + ctx.options.days + ' day(s).'
31
+ : 'The audit log is off. Turn it on in the menu (Settings > Security & privacy > Audit log) or with audit.enabled in your config.');
32
+ return 0;
33
+ }
34
+ for (const e of events) {
35
+ // What the sandbox reported is text from the sandbox: no control codes reach your terminal.
36
+ const [p, cmd, parent, dir, act] = [e.p, e.c, e.pp, e.w, e.a].map((v) => plainText(v ?? ''));
37
+ const what = e.k === 'proc'
38
+ ? (cmd || p) + (parent ? c.dim(' <- ' + path.win32.basename(parent)) : '')
39
+ : e.k === 'file'
40
+ ? act + ' ' + p + c.dim(' in ' + dir)
41
+ : e.k === 'session'
42
+ ? act + ' ' + p + c.dim(' ' + dir + ' ' + cmd)
43
+ : p;
44
+ console.log(c.dim(new Date(e.t).toLocaleString()) +
45
+ ' ' +
46
+ (e.k === 'guard' ? c.yellow(KIND_LABEL[e.k].padEnd(8)) : KIND_LABEL[e.k].padEnd(8)) +
47
+ what +
48
+ (e.n && e.n > 1 ? c.dim(' x' + e.n) : ''));
49
+ }
50
+ console.log(c.dim('\n' +
51
+ events.length +
52
+ ' event(s); the log takes ' +
53
+ humanBytes(log.bytes()) +
54
+ ' (' +
55
+ AuditLog.dirFor(ctx.storageRoot, ctx.dataPath) +
56
+ ').'));
57
+ return 0;
58
+ }
@@ -0,0 +1,2 @@
1
+ import { type Context } from '../context.js';
2
+ export declare function clean(ctx: Context): number;
@@ -0,0 +1,10 @@
1
+ import _ from 'lodash';
2
+ import { describePrune, pruneStorage } from '../../../host/storage/index.js';
3
+ import { isSandboxRunning } from '../../../host/sandbox/index.js';
4
+ import { RunDir } from '../../../shared/channel/index.js';
5
+ export function clean(ctx) {
6
+ const running = isSandboxRunning() ? new RunDir(ctx.dataPath).readSandboxStatus()?.launchId : undefined;
7
+ console.log('Cleanup: ' +
8
+ describePrune(pruneStorage(ctx.storageRoot, { launchDays: ctx.options.days, keep: _.compact([running]) })));
9
+ return 0;
10
+ }
@@ -0,0 +1,2 @@
1
+ import { type Context } from '../context.js';
2
+ export declare function config(ctx: Context): number;
@@ -0,0 +1,145 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { pathToFileURL } from 'node:url';
4
+ import { DEFAULTS, userConfigPath, userDir } from '../../../core/config/index.js';
5
+ import { allowedAnswer, allowStorePath, applyOverrides, describeOverrides, isTrusted, LOCAL_CONFIG_NAME, loosenedRequests, normalizeOverrides, OUTSIDE_FOLDER, outsideKey, outsideMappings, readLocalConfig, trustStorePath, } from '../../../core/local-config/index.js';
6
+ import { guestWorkspaceOf, previewGuest } from '../../../core/run/index.js';
7
+ import { dirExists, fail, safeText, writeJson } from '../../../core/util/index.js';
8
+ import { c, table } from '../../output/index.js';
9
+ function initConfig() {
10
+ const file = userConfigPath();
11
+ if (fs.existsSync(file))
12
+ fail(file + ' already exists.');
13
+ fs.mkdirSync(path.join(userDir(), 'hooks', 'pre-agent'), { recursive: true });
14
+ // The schema sits next to the file (a local path), so editors trust it and show docs and autocomplete.
15
+ writeJson(file, { $schema: './config.schema.json', ...DEFAULTS });
16
+ console.log('Created ' + file + '. It lists every setting with its default; delete the ones you do not change.');
17
+ console.log('Your own hook scripts go in ' + path.join(userDir(), 'hooks') + '\\{pre-provision,pre-agent,post-agent}.');
18
+ console.log("For editor help in every project's .sandbox-config.json, run: sandbox config schema");
19
+ return 0;
20
+ }
21
+ /**
22
+ * VS Code setting that maps every .sandbox-config.json (and the user config) to the local schema files, so project
23
+ * files need no "$schema" line and nothing is fetched from the internet (remote schemas need trusting).
24
+ */
25
+ function printSchemaSettings() {
26
+ const url = (name) => pathToFileURL(path.join(userDir(), name)).href;
27
+ const setting = {
28
+ 'json.schemas': [
29
+ { fileMatch: ['**/.sandbox-config.json'], url: url('sandbox-config.schema.json') },
30
+ { fileMatch: ['**/.agent-sandbox/config.json'], url: url('config.schema.json') },
31
+ ],
32
+ };
33
+ console.log('Add this to your VS Code settings.json (Ctrl+Shift+P > "Preferences: Open User Settings (JSON)"):\n');
34
+ console.log(JSON.stringify(setting, null, 2).slice(2, -2));
35
+ console.log('\nThe schema files live in ' + userDir() + ' and are refreshed whenever the sandbox command runs.');
36
+ return 0;
37
+ }
38
+ /**
39
+ * `sandbox config check`: the folder's .sandbox-config.json validated and described (risky settings flagged, approval
40
+ * state), without launching. Fails with the same message a launch would give when the file is not valid.
41
+ */
42
+ function checkLocalConfig(ctx) {
43
+ const dir = path.resolve(ctx.options.workspace ?? process.cwd());
44
+ const file = readLocalConfig(dir);
45
+ if (!file) {
46
+ console.log('No ' + LOCAL_CONFIG_NAME + ' in ' + dir + '; the sandbox uses your own settings only.');
47
+ return 0;
48
+ }
49
+ const overrides = normalizeOverrides(file.data, dir, file.path);
50
+ const approved = isTrusted(trustStorePath(ctx.storageRoot), file.path, file.hash);
51
+ console.log(file.path +
52
+ ': valid. ' +
53
+ (approved ? 'Approved (this exact version).' : 'Not approved yet: the next launch asks you.') +
54
+ '\n');
55
+ for (const line of describeOverrides(overrides, dir))
56
+ console.log(' ' + safeText(line));
57
+ previewFolders(ctx, dir, file.path, overrides);
58
+ return 0;
59
+ }
60
+ /** What a launch from here would do with each folder and each looser setting, without launching. */
61
+ function previewFolders(ctx, dir, filePath, overrides) {
62
+ const config = ctx.loaded.config;
63
+ const store = allowStorePath(ctx.storageRoot);
64
+ const workspaceGuest = guestWorkspaceOf(applyOverrides(config, overrides), dir).guest;
65
+ const outside = outsideMappings(dir, overrides.mappings);
66
+ const policy = config.projects.allowOutsideMappings;
67
+ const statusOf = (m) => {
68
+ if (!dirExists(m.host))
69
+ return m.optional
70
+ ? 'not on this PC: skipped'
71
+ : c.red('the folder does not exist: create it, fix the path, or add "optional": true');
72
+ if (!outside.includes(m))
73
+ return m.guest ? 'inside the project' : 'inside the project (already in the sandbox there)';
74
+ if (policy === true)
75
+ return 'outside the project, allowed (projects.allowOutsideMappings is true)';
76
+ if (policy === false)
77
+ return c.red('outside the project: refused (projects.allowOutsideMappings is false)');
78
+ return allowedAnswer(store, filePath, OUTSIDE_FOLDER, outsideKey(m)) === true
79
+ ? 'outside the project, allowed (you said yes)'
80
+ : c.yellow('outside the project: the next interactive launch asks you');
81
+ };
82
+ const rows = (overrides.mappings ?? []).map((m) => {
83
+ const where = previewGuest(m, dir, workspaceGuest);
84
+ return [(m.readOnly ? 'ro ' : 'rw ') + safeText(m.host), '-> ' + safeText(where.guest), statusOf(m)];
85
+ });
86
+ if (rows.length) {
87
+ console.log('\nFolders (where they appear in the sandbox):');
88
+ table(rows);
89
+ }
90
+ for (const m of overrides.mappings ?? []) {
91
+ const note = dirExists(m.host) ? previewGuest(m, dir, workspaceGuest).note : null;
92
+ if (note)
93
+ console.log(' ' + safeText(note));
94
+ }
95
+ const looser = loosenedRequests(config, overrides);
96
+ if (looser.length)
97
+ console.log('\nLooser than your settings (used only if you allow it for this project):');
98
+ for (const a of looser) {
99
+ const answer = allowedAnswer(store, filePath, a.key, a.wanted);
100
+ console.log(' ' +
101
+ a.key +
102
+ ' = ' +
103
+ JSON.stringify(a.wanted) +
104
+ ': ' +
105
+ (answer === true
106
+ ? 'allowed (you said yes)'
107
+ : answer === false
108
+ ? 'not used (you said no)'
109
+ : 'the next interactive launch asks you'));
110
+ }
111
+ }
112
+ export function config(ctx) {
113
+ const [action = 'summary'] = ctx.options.positionals;
114
+ switch (action) {
115
+ case 'summary':
116
+ table([
117
+ [
118
+ 'Settings file',
119
+ ctx.loaded.configPath ?? userConfigPath() + ' (does not exist yet; sandbox config init creates it)',
120
+ ],
121
+ ['Default agent', ctx.loaded.config.defaultHarness],
122
+ ['Storage', ctx.storageRoot],
123
+ [
124
+ 'Memory',
125
+ String(ctx.loaded.config.sandbox.memoryMb) + (ctx.loaded.config.sandbox.memoryMb === 'auto' ? '' : ' MB'),
126
+ ],
127
+ ]);
128
+ console.log('\nChange settings in the menu (sandbox > Settings). All of them as JSON: sandbox config show');
129
+ return 0;
130
+ case 'path':
131
+ console.log(ctx.loaded.configPath ?? userConfigPath() + ' (does not exist yet)');
132
+ return 0;
133
+ case 'init':
134
+ return initConfig();
135
+ case 'show':
136
+ console.log(JSON.stringify(ctx.loaded.config, null, 2));
137
+ return 0;
138
+ case 'schema':
139
+ return printSchemaSettings();
140
+ case 'check':
141
+ return checkLocalConfig(ctx);
142
+ default:
143
+ fail('Unknown config action "' + action + '".', 'Use one of: sandbox config show | path | init | schema | check');
144
+ }
145
+ }
@@ -0,0 +1,2 @@
1
+ import { type Context } from '../context.js';
2
+ export declare function doctor(ctx: Context): number;
@@ -0,0 +1,52 @@
1
+ import { expandPath } from '../../../core/util/index.js';
2
+ import { KnownProjects, ProjectRegistry } from '../../../host/projects/index.js';
3
+ import { detectWsb, doctorRows, insideSandbox, isSandboxRunning } from '../../../host/sandbox/index.js';
4
+ import { table } from '../../output/index.js';
5
+ export function doctor(ctx) {
6
+ const rows = doctorRows(ctx.loaded.config, ctx.options.harness ?? ctx.loaded.config.defaultHarness, ctx.storageRoot, ctx.loaded.configPath);
7
+ // Inside a sandbox the feature and "running" rows describe the sandbox itself, and the host rows describe nothing
8
+ // useful.
9
+ if (insideSandbox()) {
10
+ table([
11
+ ['Where', 'inside a Windows Sandbox started by this tool (run doctor on your PC to check the PC)'],
12
+ ...rows.filter(([name]) => name === 'Config file'),
13
+ ]);
14
+ return 0;
15
+ }
16
+ // Several projects: the roots mapped at every start, what the running sandbox has, and whether wsb share is there.
17
+ const p = ctx.loaded.config.projects;
18
+ const registry = isSandboxRunning() ? new ProjectRegistry(ctx.storageRoot).read() : null;
19
+ const wsb = p.wsbShare ? detectWsb() : null;
20
+ table([
21
+ ...rows,
22
+ [
23
+ 'Project roots',
24
+ p.roots.length
25
+ ? p.roots.map((r) => expandPath(r, ctx.loaded.base)).join(', ')
26
+ : 'none (sandbox projects roots add <folder>)',
27
+ ],
28
+ [
29
+ 'All projects',
30
+ p.all
31
+ ? 'on: ' +
32
+ new KnownProjects(ctx.storageRoot).list().length +
33
+ ' known project(s) mapped at every start (' +
34
+ p.exclude.length +
35
+ ' excluded)'
36
+ : 'off',
37
+ ],
38
+ ['Projects running', registry ? registry.projects.map((x) => x.name + ' (' + x.mechanism + ')').join(', ') : '-'],
39
+ [
40
+ 'wsb share',
41
+ !p.wsbShare
42
+ ? 'off (projects.wsbShare)'
43
+ : wsb
44
+ ? 'available: ' +
45
+ wsb.exe +
46
+ (wsb.version ? ' ' + wsb.version : '') +
47
+ ' (untested; a failure offers a restart instead)'
48
+ : 'not on this Windows (needs Windows 11 24H2+ with the updated Windows Sandbox): folders outside your roots need a restart',
49
+ ],
50
+ ]);
51
+ return 0;
52
+ }
@@ -0,0 +1,2 @@
1
+ import { type Context } from '../context.js';
2
+ export declare function claudeHost(ctx: Context): number;
@@ -0,0 +1,4 @@
1
+ import { hostClaude } from '../../../host/sandbox/index.js';
2
+ export function claudeHost(ctx) {
3
+ return hostClaude(ctx.storageRoot, ctx.options.personal, ctx.options.passthrough);
4
+ }
@@ -0,0 +1,8 @@
1
+ export * from './sync.js';
2
+ export * from './logs.js';
3
+ export * from './clean.js';
4
+ export * from './config.js';
5
+ export * from './doctor.js';
6
+ export * from './host-claude.js';
7
+ export * from './watch.js';
8
+ export * from './audit.js';
@@ -0,0 +1,9 @@
1
+ // sync, logs, clean, config, doctor, host-claude and the internal sync watcher.
2
+ export * from './sync.js';
3
+ export * from './logs.js';
4
+ export * from './clean.js';
5
+ export * from './config.js';
6
+ export * from './doctor.js';
7
+ export * from './host-claude.js';
8
+ export * from './watch.js';
9
+ export * from './audit.js';
@@ -0,0 +1,2 @@
1
+ import { type Context } from '../context.js';
2
+ export declare function logs(ctx: Context): Promise<number>;