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
@@ -3,24 +3,40 @@
3
3
  // sandbox is running.
4
4
  import path from 'node:path';
5
5
  import _ from 'lodash';
6
- import { DEFAULTS, loadConfig, userDir } from '../../../core/config.js';
7
- import { errMsg, expandPath, UserError } from '../../../core/util.js';
8
- import { isSandboxRunning } from '../../../host/platform.js';
9
- import { createContext, printJson, table } from '../context.js';
6
+ import { DEFAULTS, loadConfig, userDir } from '../../../core/config/index.js';
7
+ import { errMsg, expandPath, UserError } from '../../../core/util/index.js';
8
+ import { isSandboxRunning } from '../../../host/sandbox/index.js';
9
+ import { createContext } from '../context.js';
10
+ import { printJson, table } from '../../output/index.js';
10
11
  import { CHECKS } from './checks.js';
11
- const LABEL = { ok: 'OK', fixed: 'FIXED', 'needs-you': 'NEEDS YOU', warn: 'WARNING', skipped: 'SKIPPED' };
12
+ const LABEL = {
13
+ ok: 'OK',
14
+ fixed: 'FIXED',
15
+ 'needs-you': 'NEEDS YOU',
16
+ warn: 'WARNING',
17
+ skipped: 'SKIPPED',
18
+ };
12
19
  /** Runs every check in order; a check that throws is reported, never stops the rest. */
13
- export const runChecks = (env, checks = CHECKS) => checks.map((check) => {
14
- try {
15
- return { name: check.name, ...check.run(env) };
16
- }
17
- catch (e) {
18
- const fix = e instanceof UserError && e.fix ? ' ' + e.fix : '';
19
- return { name: check.name, status: 'needs-you', detail: 'check failed: ' + errMsg(e) + fix };
20
- }
21
- });
22
- export const repair = (ctx, configError = null) => {
23
- const env = { ctx, running: isSandboxRunning(), dataPath: ctx.dataPath, storageRoot: ctx.storageRoot, toolsDir: path.join(ctx.dataPath, 'tools'), configError };
20
+ export function runChecks(env, checks = CHECKS) {
21
+ return checks.map((check) => {
22
+ try {
23
+ return { name: check.name, ...check.run(env) };
24
+ }
25
+ catch (e) {
26
+ const fix = e instanceof UserError && e.fix ? ' ' + e.fix : '';
27
+ return { name: check.name, status: 'needs-you', detail: 'check failed: ' + errMsg(e) + fix };
28
+ }
29
+ });
30
+ }
31
+ export function repair(ctx, configError = null) {
32
+ const env = {
33
+ ctx,
34
+ running: isSandboxRunning(),
35
+ dataPath: ctx.dataPath,
36
+ storageRoot: ctx.storageRoot,
37
+ toolsDir: path.join(ctx.dataPath, 'tools'),
38
+ configError,
39
+ };
24
40
  // Re-check the config file even when the context loaded (it may have been edited since, or come from --config).
25
41
  if (!env.configError) {
26
42
  try {
@@ -38,14 +54,17 @@ export const repair = (ctx, configError = null) => {
38
54
  return results.some((r) => r.status === 'needs-you') ? 1 : 0;
39
55
  table(results.map((r) => [LABEL[r.status], r.name, r.detail]));
40
56
  const counts = _.countBy(results, 'status');
41
- console.log('\n' + (counts['needs-you'] ? counts['needs-you'] + ' thing(s) need you (see NEEDS YOU above).' : 'All good' + (counts.fixed ? ': fixed ' + counts.fixed + ' problem(s).' : '.')));
57
+ console.log('\n' +
58
+ (counts['needs-you']
59
+ ? counts['needs-you'] + ' thing(s) need you (see NEEDS YOU above).'
60
+ : 'All good' + (counts.fixed ? ': fixed ' + counts.fixed + ' problem(s).' : '.')));
42
61
  return counts['needs-you'] ? 1 : 0;
43
- };
62
+ }
44
63
  /**
45
64
  * Entry point that works even when the config file is broken (createContext would throw): falls back to the built-in
46
65
  * defaults so the other checks still run, and reports the config problem as the first check.
47
66
  */
48
- export const repairCommand = (packageRoot, entry, options) => {
67
+ export function repairCommand(packageRoot, entry, options) {
49
68
  let ctx;
50
69
  try {
51
70
  ctx = createContext(packageRoot, entry, options);
@@ -55,7 +74,14 @@ export const repairCommand = (packageRoot, entry, options) => {
55
74
  throw e;
56
75
  const loaded = { config: structuredClone(DEFAULTS), configPath: null, base: userDir() };
57
76
  const storageRoot = expandPath(loaded.config.storage.root, loaded.base);
58
- return repair({ packageRoot, entry, options, loaded, storageRoot, dataPath: path.join(storageRoot, 'data', loaded.config.storage.dataName) }, e);
77
+ return repair({
78
+ packageRoot,
79
+ entry,
80
+ options,
81
+ loaded,
82
+ storageRoot,
83
+ dataPath: path.join(storageRoot, 'data', loaded.config.storage.dataName),
84
+ }, e);
59
85
  }
60
86
  return repair(ctx);
61
- };
87
+ }
@@ -1,4 +1,4 @@
1
- import type { UserError } from '../../../core/util.js';
1
+ import type { UserError } from '../../../core/util/index.js';
2
2
  import type { Context } from '../context.js';
3
3
  export type RepairStatus = 'ok' | 'fixed' | 'needs-you' | 'warn' | 'skipped';
4
4
  export interface RepairResult {
@@ -18,7 +18,7 @@ export interface RepairCheck {
18
18
  name: string;
19
19
  run: (env: RepairEnv) => Omit<RepairResult, 'name'>;
20
20
  }
21
- export declare const ok: (detail: string) => Omit<RepairResult, "name">;
21
+ export declare function ok(detail: string): Omit<RepairResult, 'name'>;
22
22
  /** For fixes that must not touch folders a running sandbox may be using. */
23
23
  export declare const whileRunning: {
24
24
  status: "skipped";
@@ -1,3 +1,8 @@
1
- export const ok = (detail) => ({ status: 'ok', detail });
1
+ export function ok(detail) {
2
+ return { status: 'ok', detail };
3
+ }
2
4
  /** For fixes that must not touch folders a running sandbox may be using. */
3
- export const whileRunning = { status: 'skipped', detail: 'a sandbox is running and may be using it; run repair again once it is closed' };
5
+ export const whileRunning = {
6
+ status: 'skipped',
7
+ detail: 'a sandbox is running and may be using it; run repair again once it is closed',
8
+ };
@@ -0,0 +1,2 @@
1
+ import { type Context } from '../context.js';
2
+ export declare function attach(ctx: Context): Promise<number>;
@@ -0,0 +1,45 @@
1
+ import { select } from '@inquirer/prompts';
2
+ import { SandboxChannel, sessionsFirstIn } from '../../../host/channel/index.js';
3
+ import { ProjectRegistry } from '../../../host/projects/index.js';
4
+ import { isWithin } from '../../../shared/paths/index.js';
5
+ import { safeText, sleep } from '../../../core/util/index.js';
6
+ import { requireOnPc, requireRunning } from '../context.js';
7
+ import { attachHere, readySandbox } from '../launch/index.js';
8
+ import { locateHere } from '../projects/index.js';
9
+ import { ago } from '../../output/index.js';
10
+ import { projectOf } from './list.js';
11
+ /** Asks which session to attach to, this folder's project first (the newest is the default). */
12
+ function chooseSession(ctx, running, here) {
13
+ const projects = new ProjectRegistry(ctx.storageRoot).read()?.projects ?? [];
14
+ return select({
15
+ message: 'Which session?' + (here.project ? ' (' + here.project.name + ' first)' : ''),
16
+ choices: running.map((s) => ({
17
+ value: s.id,
18
+ name: (here.guestDir && isWithin(here.guestDir, s.cwd) ? '* ' : ' ') +
19
+ safeText(s.harness).padEnd(9) +
20
+ ' ' +
21
+ safeText(projectOf(projects, s)).padEnd(16) +
22
+ ' ' +
23
+ ago(s.startedAt).padEnd(11) +
24
+ ' ' +
25
+ s.id,
26
+ })),
27
+ });
28
+ }
29
+ export async function attach(ctx) {
30
+ requireOnPc('attach');
31
+ requireRunning('Start one with: sandbox claude --terminal');
32
+ const ready = await readySandbox(ctx.dataPath);
33
+ const channel = new SandboxChannel(ctx.dataPath);
34
+ const id = ctx.options.positionals[0];
35
+ if (!id && channel.runningSessions().length === 0)
36
+ await sleep(1500);
37
+ const here = locateHere(ctx, ready);
38
+ if (id)
39
+ return attachHere(ctx, channel.pickSession(id));
40
+ // Several sessions: choose, this folder's project first (the newest is the default).
41
+ const running = sessionsFirstIn(channel.runningSessions(), here.guestDir);
42
+ if (running.length > 1 && process.stdin.isTTY && process.stdout.isTTY)
43
+ return attachHere(ctx, channel.pickSession(await chooseSession(ctx, running, here)));
44
+ return attachHere(ctx, channel.pickSession(undefined, here.guestDir));
45
+ }
@@ -0,0 +1,4 @@
1
+ import { type Context } from '../context.js';
2
+ /** Restarts this folder's project's sessions (--all: every session). */
3
+ export declare function restart(ctx: Context): Promise<number>;
4
+ export declare function stop(ctx: Context): Promise<number>;
@@ -0,0 +1,62 @@
1
+ import path from 'node:path';
2
+ import { askYesNo } from '../../../core/prompt.js';
3
+ import { SandboxChannel } from '../../../host/channel/index.js';
4
+ import { isSandboxRunning } from '../../../host/sandbox/index.js';
5
+ import { isWithin } from '../../../shared/paths/index.js';
6
+ import { RunDir } from '../../../shared/channel/index.js';
7
+ import { fail, safeText } from '../../../core/util/index.js';
8
+ import { requireOnPc, requireRunning } from '../context.js';
9
+ import { hereDir, locateHere } from '../projects/index.js';
10
+ import { working, c } from '../../output/index.js';
11
+ /** Restarts this folder's project's sessions (--all: every session). */
12
+ export async function restart(ctx) {
13
+ requireOnPc('restart');
14
+ requireRunning();
15
+ const here = locateHere(ctx, new RunDir(ctx.dataPath).readSandboxStatus());
16
+ const scope = ctx.options.all || !here.project ? undefined : here.project.guest;
17
+ if (!scope && !ctx.options.all)
18
+ console.log(c.dim(hereDir(ctx) + ' is not a project of the running sandbox: restarting every session.'));
19
+ console.log(safeText((await working('Restarting the agents' + (scope ? ' of ' + here.project?.name : ''), () => new SandboxChannel(ctx.dataPath).restart(ctx.options.harness ?? null, scope))).message));
20
+ return 0;
21
+ }
22
+ /**
23
+ * Stopping ends every project's sessions: other projects' sessions need a yes (or --yes). A script must never end them
24
+ * by accident, so without a terminal to ask in it fails.
25
+ */
26
+ async function othersMayEnd(ctx, others) {
27
+ if (!others.length || ctx.options.yes)
28
+ return true;
29
+ const interactive = process.stdin.isTTY && process.stdout.isTTY;
30
+ if (!interactive)
31
+ fail(others.length + ' of these sessions belong to other projects, so the sandbox was not stopped.', 'Stop it anyway with: sandbox stop --yes');
32
+ return askYesNo(others.length + ' of them belong to other projects. Stop the whole sandbox?');
33
+ }
34
+ export async function stop(ctx) {
35
+ requireOnPc('stop');
36
+ if (!isSandboxRunning()) {
37
+ console.log('No Windows Sandbox is running.');
38
+ return 0;
39
+ }
40
+ const sandbox = new RunDir(ctx.dataPath).readSandboxStatus() ??
41
+ fail('This sandbox was not started by this tool.', 'Close its window instead.');
42
+ // Stopping ends every project's sessions, not just this folder's: say which, and ask when others would end too.
43
+ const here = locateHere(ctx, sandbox);
44
+ const channel = new SandboxChannel(ctx.dataPath);
45
+ const running = channel.currentSessions();
46
+ const others = running.filter((s) => !(here.guestDir && isWithin(here.project?.guest ?? here.guestDir, s.cwd)));
47
+ if (running.length)
48
+ console.log('Stopping ends ' +
49
+ running.length +
50
+ ' session(s): ' +
51
+ running
52
+ .map((s) => safeText(s.harness) + ' in ' + safeText(s.project ?? path.win32.basename(s.cwd)))
53
+ .join(', ') +
54
+ '.');
55
+ if (!(await othersMayEnd(ctx, others))) {
56
+ console.log('Nothing changed.');
57
+ return 1;
58
+ }
59
+ await working('Asking the sandbox to shut down', () => channel.exec(['C:\\Windows\\System32\\shutdown.exe', '/s', '/t', '2'], sandbox.guestWorkspace, 30));
60
+ console.log('Sandbox is shutting down; history and claude-mem sync back when it closes.');
61
+ return 0;
62
+ }
@@ -0,0 +1,6 @@
1
+ import { type Context } from '../context.js';
2
+ export declare function exec(ctx: Context): Promise<number>;
3
+ /**
4
+ * `sandbox db`: runs the sandbox's own `sbx-db` in this folder's project, which knows its database versions and ports.
5
+ */
6
+ export declare function db(ctx: Context): Promise<number>;
@@ -0,0 +1,72 @@
1
+ import path from 'node:path';
2
+ import { spawnSync } from 'node:child_process';
3
+ import { SandboxChannel } from '../../../host/channel/index.js';
4
+ import { insideSandbox } from '../../../host/sandbox/index.js';
5
+ import { NeedsRestart } from '../../../host/projects/index.js';
6
+ import { fail, safeText } from '../../../core/util/index.js';
7
+ import { printJson, working } from '../../output/index.js';
8
+ import { requireOnPc, requireRunning } from '../context.js';
9
+ import { readySandbox } from '../launch/index.js';
10
+ import { hereDir, joinHere, provisionJoined } from '../projects/index.js';
11
+ /** What a command run in the sandbox printed (text from the sandbox: through safeText), or why it failed. */
12
+ function printExecResult(result) {
13
+ if (result.stdout)
14
+ process.stdout.write(safeText(result.stdout));
15
+ if (result.stderr)
16
+ process.stderr.write(safeText(result.stderr));
17
+ if (!result.ok && !result.stdout && !result.stderr)
18
+ console.error(safeText(result.message));
19
+ }
20
+ /** The guest folder for this folder, joining the running sandbox (and setting the project up) when needed. */
21
+ async function guestFolderHere(ctx, what) {
22
+ const ready = await readySandbox(ctx.dataPath);
23
+ try {
24
+ // A command needs no restart for what the project wants at boot: it runs without them (and says so).
25
+ const joined = await joinHere(ctx, ready, { noRestart: true });
26
+ for (const note of joined.notes)
27
+ console.error(note);
28
+ await provisionJoined(ctx, joined);
29
+ return joined.guestDir;
30
+ }
31
+ catch (e) {
32
+ if (!(e instanceof NeedsRestart))
33
+ throw e;
34
+ return fail(hereDir(ctx) + ' is not in the running sandbox (' + e.reason + '), so "sandbox ' + what + '" cannot run there.', 'sandbox claude (or sandbox start) from that folder offers a restart that adds it; or add its parent folder as a root: sandbox projects roots add "' +
35
+ path.dirname(e.hostDir) +
36
+ '"');
37
+ }
38
+ }
39
+ export async function exec(ctx) {
40
+ const command = [...ctx.options.positionals, ...ctx.options.passthrough];
41
+ if (command.length === 0)
42
+ fail('No command given.', 'Usage: sandbox exec [--timeout <s>] -- <command> [args...]');
43
+ requireOnPc('exec');
44
+ requireRunning();
45
+ const cwd = await guestFolderHere(ctx, 'exec');
46
+ const result = await new SandboxChannel(ctx.dataPath).exec(command, cwd, ctx.options.timeout);
47
+ if (!printJson(ctx, result))
48
+ printExecResult(result);
49
+ return result.exitCode ?? 1;
50
+ }
51
+ /**
52
+ * `sandbox db`: runs the sandbox's own `sbx-db` in this folder's project, which knows its database versions and ports.
53
+ */
54
+ export async function db(ctx) {
55
+ const [action = 'list', name] = ctx.options.positionals;
56
+ if (!['list', 'start', 'stop'].includes(action))
57
+ fail('Unknown db action "' + action + '".', 'Use: sandbox db (list) or sandbox db start|stop <postgres|mysql|mongodb|redis|dynamodb>');
58
+ if (action !== 'list' && !name)
59
+ fail('Which database?', 'Usage: sandbox db ' + action + ' <postgres|mysql|mongodb|redis|dynamodb>');
60
+ // Already inside the sandbox: run the database tool here instead of asking the sandbox from outside.
61
+ if (insideSandbox())
62
+ return (spawnSync(process.execPath, [path.join(ctx.packageRoot, 'dist', 'runtime', 'db.js'), action, ...(name ? [name] : [])], { stdio: 'inherit', windowsHide: true }).status ?? 1);
63
+ requireRunning('Start one with: sandbox start --database <name>');
64
+ const cwd = await guestFolderHere(ctx, 'db');
65
+ // Starting can download the database the first time.
66
+ const result = await working((action === 'list' ? 'Asking' : action === 'start' ? 'Starting' : 'Stopping') +
67
+ ' the database' +
68
+ (name ? ' ' + name : 's') +
69
+ ' in the sandbox', () => new SandboxChannel(ctx.dataPath).exec(['sbx-db', action, ...(name ? [name] : [])], cwd, 1800));
70
+ printExecResult(result);
71
+ return result.exitCode ?? 1;
72
+ }
@@ -0,0 +1,6 @@
1
+ export * from './attach.js';
2
+ export * from './list.js';
3
+ export * from './status.js';
4
+ export * from './exec.js';
5
+ export * from './control.js';
6
+ export * from './window.js';
@@ -0,0 +1,9 @@
1
+ // Working with a running sandbox: attach, sessions, status, exec, restart, stop, show/hide. Each knows which project
2
+ // you run it from (project.ts): attach and sessions put that project's sessions first, exec and db run in it, restart
3
+ // restarts its sessions, stop warns about the other projects' sessions.
4
+ export * from './attach.js';
5
+ export * from './list.js';
6
+ export * from './status.js';
7
+ export * from './exec.js';
8
+ export * from './control.js';
9
+ export * from './window.js';
@@ -0,0 +1,15 @@
1
+ import type { SessionStatus } from '../../../core/types.js';
2
+ import type { Viewers } from '../../../shared/pty/index.js';
3
+ import { type RegistryEntry } from '../../../host/projects/index.js';
4
+ import { type Context } from '../context.js';
5
+ export declare function viewerText(v: Viewers | null | undefined): string;
6
+ export declare function projectOf(projects: RegistryEntry[], s: SessionStatus): string;
7
+ /** A session with who is watching it and whether it is in the project of the current folder. */
8
+ export type ListedSession = SessionStatus & {
9
+ readonly viewers?: Viewers | null;
10
+ readonly here?: boolean;
11
+ readonly projectName?: string;
12
+ };
13
+ /** Sessions with who is watching them; `here` marks the ones in the project of the current folder. */
14
+ export declare function listedSessions(ctx: Context): Promise<ListedSession[]>;
15
+ export declare function sessions(ctx: Context): Promise<number>;
@@ -0,0 +1,65 @@
1
+ import _ from 'lodash';
2
+ import { SandboxChannel, sessionViewers } from '../../../host/channel/index.js';
3
+ import { isSandboxRunning } from '../../../host/sandbox/index.js';
4
+ import { ProjectRegistry } from '../../../host/projects/index.js';
5
+ import { isWithin, projectForGuestDir } from '../../../shared/paths/index.js';
6
+ import { RunDir } from '../../../shared/channel/index.js';
7
+ import { safeText } from '../../../core/util/index.js';
8
+ import { printJson, table, ago, c, shortenMiddle, termWidth } from '../../output/index.js';
9
+ import { locateHere } from '../projects/index.js';
10
+ export function viewerText(v) {
11
+ return v === undefined
12
+ ? '-'
13
+ : v === null
14
+ ? 'unknown (older session)'
15
+ : v.remote + ' here, ' + (v.viewers - v.remote) + ' in sandbox';
16
+ }
17
+ export function projectOf(projects, s) {
18
+ return s.project ?? projectForGuestDir(projects, s.cwd)?.name ?? '-';
19
+ }
20
+ /** Sessions with who is watching them; `here` marks the ones in the project of the current folder. */
21
+ export async function listedSessions(ctx) {
22
+ // Who is attached comes from each session itself, so a terminal that was closed is never counted.
23
+ const live = isSandboxRunning();
24
+ // Only this sandbox's sessions are asked (and at most MAX_QUERIED_SESSIONS): the sandbox writes these files.
25
+ const ask = new Set(live ? new SandboxChannel(ctx.dataPath).currentSessions().map((s) => s.id) : []);
26
+ const here = live ? locateHere(ctx, new RunDir(ctx.dataPath).readSandboxStatus()) : { guestDir: null };
27
+ const projects = new ProjectRegistry(ctx.storageRoot).read()?.projects ?? [];
28
+ return Promise.all(new RunDir(ctx.dataPath).listSessions().map(async (s) => ({
29
+ ...s,
30
+ projectName: projectOf(projects, s),
31
+ here: Boolean(here.guestDir && isWithin(here.guestDir, s.cwd)),
32
+ ...(ask.has(s.id) ? { viewers: await sessionViewers(s) } : {}),
33
+ })));
34
+ }
35
+ export async function sessions(ctx) {
36
+ const list = await listedSessions(ctx);
37
+ if (printJson(ctx, list.map((s) => _.omit(s, 'attach'))))
38
+ return 0;
39
+ if (list.length === 0) {
40
+ console.log('No sessions. Start one with: sandbox claude');
41
+ return 0;
42
+ }
43
+ // This folder's project first, newest first within each group; harness, cwd and times are written by the sandbox.
44
+ const ordered = [
45
+ ..._.sortBy(list.filter((s) => s.here), (s) => s.startedAt).reverse(),
46
+ ..._.sortBy(list.filter((s) => !s.here), (s) => s.startedAt).reverse(),
47
+ ];
48
+ const folderWidth = Math.max(16, termWidth() - 80);
49
+ table([
50
+ ['', 'ID', 'AGENT', 'PROJECT', 'STATE', 'ATTACHED', 'FOLDER', 'STARTED'],
51
+ ...ordered.map((s) => [
52
+ s.here ? '*' : '',
53
+ s.id,
54
+ safeText(s.harness),
55
+ safeText(s.projectName ?? '-'),
56
+ s.phase + (s.exitCode !== undefined ? ' (' + s.exitCode + ')' : ''),
57
+ viewerText(s.viewers),
58
+ shortenMiddle(safeText(s.cwd), folderWidth),
59
+ ago(s.startedAt),
60
+ ]),
61
+ ]);
62
+ if (list.some((s) => s.here))
63
+ console.log(c.dim('* = the project of this folder'));
64
+ return 0;
65
+ }
@@ -0,0 +1,2 @@
1
+ import type { Context } from '../context.js';
2
+ export declare function status(ctx: Context): Promise<number>;
@@ -0,0 +1,153 @@
1
+ import _ from 'lodash';
2
+ import { AccountStore } from '../../../host/profile/index.js';
3
+ import { SandboxChannel } from '../../../host/channel/index.js';
4
+ import { isSandboxRunning } from '../../../host/sandbox/index.js';
5
+ import { ProjectRegistry } from '../../../host/projects/index.js';
6
+ import { RepoGuardStore } from '../../../host/guard/index.js';
7
+ import { projectForGuestDir } from '../../../shared/paths/index.js';
8
+ import { RunDir } from '../../../shared/channel/index.js';
9
+ import { watcherRunning } from '../../../sync/index.js';
10
+ import { errMsg, safeText } from '../../../core/util/index.js';
11
+ import { printJson, table, ago, c, shortenMiddle, termWidth } from '../../output/index.js';
12
+ import { hereDir, locateHere } from '../projects/index.js';
13
+ import { listedSessions, viewerText } from './list.js';
14
+ /** Running databases by port, from the sandbox's own `sbx-db list` (best effort: unknown when it does not answer). */
15
+ async function runningPorts(channel, cwd) {
16
+ try {
17
+ const r = await channel.exec(['sbx-db', 'list'], cwd, 30);
18
+ return new Set((r.stdout ?? '')
19
+ .split(/\r?\n/)
20
+ .filter((l) => /\brunning\b/.test(l))
21
+ .map((l) => Number(/port (\d+)/.exec(l)?.[1]))
22
+ .filter((n) => n > 0));
23
+ }
24
+ catch {
25
+ return null;
26
+ }
27
+ }
28
+ /** One project: its setup, databases, running sessions and repo guard findings (sandbox text through safeText). */
29
+ function projectInfo(p, all, facts) {
30
+ const prov = facts.provisioning.find((s) => s.name.toLowerCase() === p.name.toLowerCase());
31
+ const own = facts.sessions.filter((s) => s.phase === 'running' && projectForGuestDir(all, s.cwd)?.name === p.name);
32
+ const { ports } = facts;
33
+ return {
34
+ name: p.name,
35
+ host: p.host,
36
+ guest: p.guest,
37
+ mechanism: p.mechanism,
38
+ here: facts.here === p.name,
39
+ setup: prov
40
+ ? { phase: prov.phase, message: safeText(prov.message) }
41
+ : { phase: 'not set up yet', message: 'set up when you first start a session or command there' },
42
+ databases: (prov?.databases ?? []).map((d) => ({
43
+ database: safeText(d.database),
44
+ port: d.port,
45
+ state: ports ? (ports.has(d.port) ? 'running' : 'stopped') : 'unknown',
46
+ })),
47
+ sessions: own.map((s) => ({
48
+ id: s.id,
49
+ harness: safeText(s.harness),
50
+ viewers: viewerText(s.viewers),
51
+ started: s.startedAt,
52
+ })),
53
+ // With several guarded folders each finding starts with its folder.
54
+ repoGuard: facts.findings
55
+ .filter((f) => f.detail.toLowerCase().startsWith(p.host.toLowerCase() + ':'))
56
+ .map((f) => f.kind + ': ' + safeText(f.detail)),
57
+ };
58
+ }
59
+ const MECHANISM_TEXT = {
60
+ launch: 'started from here',
61
+ root: 'in a project root',
62
+ boot: 'mapped at start',
63
+ };
64
+ function mechanismText(mechanism) {
65
+ return mechanism in MECHANISM_TEXT ? MECHANISM_TEXT[mechanism] : 'wsb share';
66
+ }
67
+ function printProject(p) {
68
+ console.log((p.here ? '* ' : ' ') +
69
+ c.bold(p.name) +
70
+ ' ' +
71
+ p.host +
72
+ ' -> ' +
73
+ p.guest +
74
+ c.dim(' (' + mechanismText(p.mechanism) + ')'));
75
+ console.log(' setup: ' +
76
+ p.setup.phase +
77
+ (p.setup.phase === 'ready' ? '' : ' - ' + shortenMiddle(p.setup.message, termWidth() - 20)));
78
+ if (p.databases.length)
79
+ console.log(' databases: ' + p.databases.map((d) => d.database + ' :' + d.port + ' ' + d.state).join(', '));
80
+ for (const s of p.sessions)
81
+ console.log(' session ' + s.id + ' ' + s.harness + ' ' + s.viewers + ' ' + ago(s.started));
82
+ for (const f of p.repoGuard)
83
+ console.log(' ' + c.yellow('guard: ' + f));
84
+ }
85
+ export async function status(ctx) {
86
+ const running = isSandboxRunning();
87
+ const run = new RunDir(ctx.dataPath);
88
+ const channel = new SandboxChannel(ctx.dataPath);
89
+ const guard = new RepoGuardStore(ctx.dataPath);
90
+ const sandbox = run.readSandboxStatus();
91
+ const registry = running ? new ProjectRegistry(ctx.storageRoot).read() : null;
92
+ const ready = running && sandbox?.phase === 'ready';
93
+ const daemon = ready
94
+ ? await channel.ping().then((r) => r.message, (e) => 'no answer (' + errMsg(e) + ')')
95
+ : '-';
96
+ const here = running ? locateHere(ctx, sandbox) : { project: null, guestDir: null };
97
+ const sessionList = running ? await listedSessions(ctx) : [];
98
+ const provisioning = running ? run.listProjectStatus() : [];
99
+ const ports = ready && sandbox ? await runningPorts(channel, sandbox.guestWorkspace) : null;
100
+ const findings = guard.findings();
101
+ const startedAt = Number(/^(\d+)-/.exec(registry?.launchId ?? sandbox?.launchId ?? '')?.[1]) || null;
102
+ const all = registry?.projects ?? [];
103
+ const facts = { here: here.project?.name ?? null, provisioning, sessions: sessionList, ports, findings };
104
+ const projects = all.map((p) => projectInfo(p, all, facts));
105
+ const info = {
106
+ sandbox: {
107
+ running,
108
+ phase: running ? (sandbox?.phase ?? 'unknown') : 'stopped',
109
+ message: sandbox?.message,
110
+ headless: sandbox?.headless,
111
+ uptime: running && startedAt ? ago(startedAt).replace(' ago', '') : null,
112
+ daemon,
113
+ account: new AccountStore(ctx.storageRoot).activeFor(ctx.dataPath),
114
+ syncWatcher: watcherRunning(ctx.dataPath),
115
+ },
116
+ here: { folder: hereDir(ctx), project: here.project?.name ?? null, guest: here.guestDir },
117
+ roots: registry?.roots ?? [],
118
+ projects,
119
+ otherSessions: sessionList
120
+ .filter((s) => s.phase === 'running' && !projects.some((p) => p.sessions.some((x) => x.id === s.id)))
121
+ .map((s) => ({ id: s.id, harness: safeText(s.harness), cwd: safeText(s.cwd) })),
122
+ repoGuard: {
123
+ guarded: guard.guarded().length,
124
+ findings: findings.map((f) => f.kind + ': ' + f.detail),
125
+ },
126
+ };
127
+ if (printJson(ctx, info))
128
+ return 0;
129
+ const yesNo = (v) => (typeof v === 'boolean' ? (v ? 'yes' : 'no') : String(v ?? '-'));
130
+ table(Object.entries(info.sandbox).map(([k, v]) => [_.startCase(k), safeText(yesNo(v))]));
131
+ if (!running)
132
+ return 0;
133
+ console.log('\n' +
134
+ c.bold('Projects') +
135
+ c.dim(' (* = this folder: ' + info.here.folder + (info.here.project ? '' : ', not in this sandbox') + ')'));
136
+ for (const p of projects)
137
+ printProject(p);
138
+ for (const r of info.roots)
139
+ console.log(' root ' + r.host + ' -> ' + r.guest + c.dim(' (every project in it opens without a restart)'));
140
+ for (const s of info.otherSessions)
141
+ console.log(' session ' + s.id + ' ' + s.harness + ' ' + s.cwd);
142
+ console.log('\n' +
143
+ c.bold('Repo guard') +
144
+ ' ' +
145
+ info.repoGuard.guarded +
146
+ ' folder(s) guarded; ' +
147
+ (findings.length
148
+ ? c.yellow(findings.length + ' change(s) neutralised:')
149
+ : 'nothing from the sandbox needed neutralising'));
150
+ for (const f of info.repoGuard.findings.slice(-10))
151
+ console.log(' ' + c.yellow(safeText(f)));
152
+ return 0;
153
+ }
@@ -0,0 +1,3 @@
1
+ import { type Context } from '../context.js';
2
+ export declare function show(ctx: Context): number;
3
+ export declare function hide(ctx: Context): Promise<number>;
@@ -0,0 +1,18 @@
1
+ import { hideSandboxWindow, showSandboxWindow } from '../../../host/sandbox/index.js';
2
+ import { fail } from '../../../core/util/index.js';
3
+ import { requireOnPc, requireRunning } from '../context.js';
4
+ export function show(ctx) {
5
+ requireOnPc('show');
6
+ requireRunning();
7
+ if (!showSandboxWindow(ctx.storageRoot))
8
+ fail('Could not find the Windows Sandbox window.', 'It may still be starting; try again in a few seconds.');
9
+ return 0;
10
+ }
11
+ export async function hide(ctx) {
12
+ requireOnPc('hide');
13
+ requireRunning();
14
+ if (!(await hideSandboxWindow(ctx.storageRoot, 5)))
15
+ fail('Could not find a visible Windows Sandbox window.', 'It may already be hidden (sbx-show brings it back).');
16
+ console.log('Sandbox window hidden. Bring it back with: sbx-show');
17
+ return 0;
18
+ }
@@ -6,8 +6,8 @@ export interface Check {
6
6
  detail: string;
7
7
  }
8
8
  /** Windows Sandbox needs Pro, Enterprise or Education (build 18305+); Home ("Core*") and Server cannot run it. */
9
- export declare const editionSupport: (edition: string | null) => EditionSupport;
10
- export declare const nodeMajor: (version: string) => number;
9
+ export declare function editionSupport(edition: string | null): EditionSupport;
10
+ export declare function nodeMajor(version: string): number;
11
11
  /** Offer to enable the feature only when it is off and this edition can have it. */
12
- export declare const canEnableFeature: (f: MachineFacts) => boolean;
13
- export declare const buildChecks: (f: MachineFacts) => Check[];
12
+ export declare function canEnableFeature(f: MachineFacts): boolean;
13
+ export declare function buildChecks(f: MachineFacts): Check[];