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,33 @@
1
+ // (Beta) Agent commands: with agentCommands.enabled, typing an agent's own command on this PC (claude, codex, ...) starts
2
+ // it in a hidden sandbox for the folder you are in and attaches that terminal. Small forwarding files in
3
+ // <storage>\agent-commands go first on YOUR PATH (so they win over npm's and the installers' copies); turning it off
4
+ // removes the files and that one PATH entry. SANDBOX_AGENT_DIRECT=1 runs the real agent on this PC instead.
5
+ import path from 'node:path';
6
+ import { fileExists } from '../../core/util/index.js';
7
+ export const commandsDir = (storageRoot) => path.join(storageRoot, 'agent-commands');
8
+ const EXTENSIONS = ['.exe', '.cmd', '.bat'];
9
+ /** cmd.exe expands % and ^ even inside quotes: such paths cannot go into a forwarding file safely. */
10
+ export const cmdSafe = (p) => !/[%"^\r\n]/.test(p);
11
+ /** The agent's own executable on this PC, skipping this tool's forwarding files. */
12
+ export const realAgent = (command, skipDir, pathValue = process.env.PATH ?? process.env.Path ?? '') => {
13
+ const skip = path.resolve(skipDir).toLowerCase();
14
+ const dirs = pathValue.split(path.delimiter).filter((d) => d && path.resolve(d).toLowerCase() !== skip);
15
+ for (const dir of dirs)
16
+ for (const ext of EXTENSIONS) {
17
+ const candidate = path.join(dir, command + ext);
18
+ if (fileExists(candidate))
19
+ return candidate;
20
+ }
21
+ return null;
22
+ };
23
+ /** The agents that get a forwarding command: installed on this PC, and listed (or "auto" = all of them). */
24
+ export const agentCommands = (config, storageRoot, pathValue) => {
25
+ const wanted = config.agentCommands.agents;
26
+ return Object.entries(config.harnesses).flatMap(([harness, h]) => {
27
+ if (wanted !== 'auto' && !wanted.includes(harness))
28
+ return [];
29
+ const command = h.npmBin ?? (h.hostExecutable ? path.parse(h.hostExecutable).name : harness);
30
+ const real = /^[A-Za-z0-9._-]+$/.test(command) ? realAgent(command, commandsDir(storageRoot), pathValue) : null;
31
+ return real && cmdSafe(real) ? [{ harness, command, real }] : [];
32
+ });
33
+ };
@@ -0,0 +1,7 @@
1
+ import type { AgentCommand } from './commands.js';
2
+ /** Marks files this tool wrote, so only those are ever replaced or removed. */
3
+ export declare const MARKER = "windows-development-sandbox agent command";
4
+ /** The .cmd file for one agent (cmd, PowerShell and Windows Terminal all run it). */
5
+ export declare const forwardingCmd: (a: AgentCommand, node: string, entry: string) => string;
6
+ /** The same for Git Bash, which looks for a file without an extension. */
7
+ export declare const forwardingSh: (a: AgentCommand, node: string, entry: string) => string;
@@ -0,0 +1,31 @@
1
+ /** Marks files this tool wrote, so only those are ever replaced or removed. */
2
+ export const MARKER = 'windows-development-sandbox agent command';
3
+ /** The .cmd file for one agent (cmd, PowerShell and Windows Terminal all run it). */
4
+ export const forwardingCmd = (a, node, entry) => [
5
+ '@echo off',
6
+ 'rem ' + MARKER + ' (Beta). Turn off: sandbox agent-commands off. Run the real one: set SANDBOX_AGENT_DIRECT=1',
7
+ 'if "%SANDBOX_AGENT_DIRECT%"=="1" goto direct',
8
+ '"' + node + '" "' + entry + '" launch --harness ' + a.harness + ' --headless --terminal -- %*',
9
+ 'exit /b %errorlevel%',
10
+ ':direct',
11
+ 'call "' + a.real + '" %*',
12
+ '',
13
+ ].join('\r\n');
14
+ /** The same for Git Bash, which looks for a file without an extension. */
15
+ export const forwardingSh = (a, node, entry) => {
16
+ const posix = (p) => p.replace(/^([A-Za-z]):/, (_m, d) => '/' + d.toLowerCase()).replace(/\\/g, '/');
17
+ const q = (s) => "'" + s.replace(/'/g, "'\\''") + "'";
18
+ return [
19
+ '#!/bin/sh',
20
+ '# ' + MARKER + ' (Beta). Turn off: sandbox agent-commands off. Run the real one: SANDBOX_AGENT_DIRECT=1',
21
+ 'if [ "$SANDBOX_AGENT_DIRECT" = "1" ]; then exec ' + q(posix(a.real)) + ' "$@"; fi',
22
+ 'exec ' +
23
+ q(posix(node)) +
24
+ ' ' +
25
+ q(posix(entry)) +
26
+ ' launch --harness ' +
27
+ a.harness +
28
+ ' --headless --terminal -- "$@"',
29
+ '',
30
+ ].join('\n');
31
+ };
@@ -0,0 +1,4 @@
1
+ export * from './commands.js';
2
+ export * from './forwarders.js';
3
+ export * from './user-path.js';
4
+ export * from './reconcile.js';
@@ -0,0 +1,4 @@
1
+ export * from './commands.js';
2
+ export * from './forwarders.js';
3
+ export * from './user-path.js';
4
+ export * from './reconcile.js';
@@ -0,0 +1,12 @@
1
+ import type { Config } from '../../core/types.js';
2
+ import { type AgentCommand } from './commands.js';
3
+ export interface Reconciled {
4
+ on: boolean;
5
+ commands: AgentCommand[];
6
+ changed: boolean;
7
+ }
8
+ /**
9
+ * Makes this PC match agentCommands: on = a forwarding file per installed agent and the folder first on your PATH;
10
+ * off = no files, no PATH entry. Only touches files it wrote and its own PATH entry; does nothing when already right.
11
+ */
12
+ export declare const reconcileAgentCommands: (config: Config, storageRoot: string, node: string, entry: string) => Reconciled;
@@ -0,0 +1,69 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { ensureDir, fileExists } from '../../core/util/index.js';
4
+ import { writeFileAtomic } from '../../shared/io/index.js';
5
+ import { safeRemove } from '../../shared/io/index.js';
6
+ import { MARKER, forwardingCmd, forwardingSh } from './forwarders.js';
7
+ import { commandsDir, cmdSafe, agentCommands } from './commands.js';
8
+ import { editUserPath } from './user-path.js';
9
+ const ownFiles = (dir) => fs.existsSync(dir)
10
+ ? fs
11
+ .readdirSync(dir)
12
+ .map((f) => path.join(dir, f))
13
+ .filter((f) => {
14
+ try {
15
+ return fs.lstatSync(f).isFile() && fs.readFileSync(f, 'utf8').includes(MARKER);
16
+ }
17
+ catch {
18
+ return false;
19
+ }
20
+ })
21
+ : [];
22
+ /**
23
+ * Makes this PC match agentCommands: on = a forwarding file per installed agent and the folder first on your PATH;
24
+ * off = no files, no PATH entry. Only touches files it wrote and its own PATH entry; does nothing when already right.
25
+ */
26
+ export const reconcileAgentCommands = (config, storageRoot, node, entry) => {
27
+ const dir = commandsDir(storageRoot);
28
+ if (!config.agentCommands.enabled) {
29
+ if (!fs.existsSync(dir))
30
+ return { on: false, commands: [], changed: false };
31
+ for (const f of ownFiles(dir))
32
+ fs.rmSync(f, { force: true });
33
+ editUserPath(dir, false);
34
+ if (fs.readdirSync(dir).length === 0)
35
+ safeRemove(dir, storageRoot);
36
+ return { on: false, commands: [], changed: true };
37
+ }
38
+ if (!cmdSafe(node) || !cmdSafe(entry))
39
+ throw new Error('This tool is installed in a folder whose path has % " or ^, which cannot go into a command file safely.');
40
+ const commands = agentCommands(config, storageRoot);
41
+ ensureDir(dir);
42
+ const wanted = new Map();
43
+ for (const a of commands) {
44
+ wanted.set(path.join(dir, a.command + '.cmd'), forwardingCmd(a, node, entry));
45
+ wanted.set(path.join(dir, a.command), forwardingSh(a, node, entry));
46
+ }
47
+ let changed = false;
48
+ for (const f of ownFiles(dir))
49
+ if (!wanted.has(f)) {
50
+ fs.rmSync(f, { force: true });
51
+ changed = true;
52
+ }
53
+ for (const [file, text] of wanted) {
54
+ const current = fileExists(file) ? fs.readFileSync(file, 'utf8') : null;
55
+ // A file of the same name that this tool did not write is never replaced.
56
+ if (current !== null && !current.includes(MARKER))
57
+ continue;
58
+ if (current !== text) {
59
+ writeFileAtomic(file, text);
60
+ changed = true;
61
+ }
62
+ }
63
+ const onPath = (process.env.PATH ?? '')
64
+ .split(path.delimiter)
65
+ .some((d) => path.resolve(d).toLowerCase() === path.resolve(dir).toLowerCase());
66
+ if (changed || !onPath)
67
+ editUserPath(dir, true);
68
+ return { on: true, commands, changed: changed || !onPath };
69
+ };
@@ -0,0 +1,2 @@
1
+ /** Runs a PowerShell script that edits YOUR PATH (HKCU\Environment) unexpanded, then tells Windows it changed. */
2
+ export declare const editUserPath: (dir: string, add: boolean) => void;
@@ -0,0 +1,33 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ import { SYSTEM } from '../../shared/system.js';
3
+ import { refuseInSelfTest } from '../test-guard.js';
4
+ /** Runs a PowerShell script that edits YOUR PATH (HKCU\Environment) unexpanded, then tells Windows it changed. */
5
+ export const editUserPath = (dir, add) => {
6
+ refuseInSelfTest('change your PATH');
7
+ const quoted = "'" + dir.replace(/'/g, "''") + "'";
8
+ const script = [
9
+ '$dir = ' + quoted,
10
+ "$key = [Microsoft.Win32.Registry]::CurrentUser.CreateSubKey('Environment')",
11
+ 'try {',
12
+ " $raw = [string]$key.GetValue('Path', '', [Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames)",
13
+ " $rest = @($raw -split ';' | Where-Object { $_ -and $_.TrimEnd('\\') -ine $dir.TrimEnd('\\') })",
14
+ // First, so these commands win over the agents' own folders (also on YOUR PATH).
15
+ add ? " $new = (@($dir) + $rest) -join ';'" : " $new = $rest -join ';'",
16
+ " if ($new -eq $raw.TrimEnd(';')) { exit 0 }",
17
+ " if ($new.Length -gt 32000) { Write-Error 'PATH too long'; exit 3 }",
18
+ " $kind = if ($key.GetValueNames() -contains 'Path') { $key.GetValueKind('Path') } else { [Microsoft.Win32.RegistryValueKind]::ExpandString }",
19
+ " $key.SetValue('Path', $new, $kind)",
20
+ '} finally { $key.Close() }',
21
+ 'Add-Type -Namespace WdsAgents -Name Native -MemberDefinition \'[System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)] public static extern System.IntPtr SendMessageTimeout(System.IntPtr hWnd, uint msg, System.UIntPtr wParam, string lParam, uint flags, uint timeout, out System.UIntPtr result);\'',
22
+ '$ignored = [UIntPtr]::Zero',
23
+ "[void][WdsAgents.Native]::SendMessageTimeout([IntPtr]0xffff, 0x1A, [UIntPtr]::Zero, 'Environment', 2, 5000, [ref]$ignored)",
24
+ ].join('\n');
25
+ const result = spawnSync(SYSTEM.powershell(), ['-NoProfile', '-NonInteractive', '-OutputFormat', 'Text', '-Command', script], { encoding: 'utf8', windowsHide: true });
26
+ if (result.status === 3)
27
+ throw new Error('Your PATH is too long to add ' + dir + '.');
28
+ if (result.status !== 0)
29
+ throw new Error('Could not ' +
30
+ (add ? 'add ' + dir + ' to' : 'remove ' + dir + ' from') +
31
+ ' your PATH: ' +
32
+ (result.stderr || result.error?.message || 'exit ' + result.status).trim());
33
+ };
@@ -1,5 +1,5 @@
1
1
  import { z } from 'zod';
2
- declare const AuditSettings: z.ZodObject<{
2
+ declare const AuditSettingsSchema: z.ZodObject<{
3
3
  enabled: z.ZodBoolean;
4
4
  days: z.ZodNumber;
5
5
  maxMb: z.ZodNumber;
@@ -7,7 +7,7 @@ declare const AuditSettings: z.ZodObject<{
7
7
  files: z.ZodBoolean;
8
8
  projects: z.ZodArray<z.ZodString>;
9
9
  }, z.core.$strip>;
10
- export type AuditSettings = z.output<typeof AuditSettings>;
10
+ export type AuditSettings = z.output<typeof AuditSettingsSchema>;
11
11
  /** Host-only: the audit settings of the running sandbox (written at launch, read by the watcher). */
12
12
  export declare const saveAuditSettings: (storageRoot: string, dataPath: string, settings: AuditSettings) => void;
13
13
  export declare const readAuditSettings: (storageRoot: string, dataPath: string) => AuditSettings | null;
@@ -6,21 +6,27 @@
6
6
  import fs from 'node:fs';
7
7
  import path from 'node:path';
8
8
  import { z } from 'zod';
9
- import { assertNoLinks } from '../../core/util.js';
10
- import { listSessions, readValid, runPaths, writeJsonAtomic } from '../../shared/rundir.js';
11
- import { AuditEvent, AuditLog, fold } from './log.js';
9
+ import { assertNoLinks } from '../../core/util/index.js';
10
+ import { RunDir } from '../../shared/channel/index.js';
11
+ import { JsonFile } from '../../shared/io/index.js';
12
+ import { hostStateFile } from '../storage/index.js';
13
+ import { AuditEventSchema, AuditLog, fold } from './log.js';
12
14
  const MAX_FILES_PER_PASS = 200;
13
15
  const MAX_FILE_BYTES = 8 * 1024 * 1024;
14
16
  /** Paths in a project not worth a line each (git's own bookkeeping, dependency folders). */
15
17
  const QUIET = /(^|[\\/])(\.git[\\/](objects|logs|refs|index\.lock|FETCH_HEAD|ORIG_HEAD)|node_modules[\\/]|target[\\/]|\.venv[\\/]|__pycache__[\\/])/i;
16
- const AuditSettings = z.object({
17
- enabled: z.boolean(), days: z.number().int().min(1).max(365), maxMb: z.number().int().min(5).max(5000), processes: z.boolean(), files: z.boolean(),
18
+ const AuditSettingsSchema = z.object({
19
+ enabled: z.boolean(),
20
+ days: z.number().int().min(1).max(365),
21
+ maxMb: z.number().int().min(5).max(5000),
22
+ processes: z.boolean(),
23
+ files: z.boolean(),
18
24
  projects: z.array(z.string().max(1024)).max(64),
19
25
  });
20
- const settingsFile = (storageRoot, dataPath) => path.join(storageRoot, 'sync', path.basename(dataPath) + '-audit.json');
26
+ const settingsFile = (storageRoot, dataPath) => new JsonFile(AuditSettingsSchema, hostStateFile(storageRoot, dataPath, '-audit.json'));
21
27
  /** Host-only: the audit settings of the running sandbox (written at launch, read by the watcher). */
22
- export const saveAuditSettings = (storageRoot, dataPath, settings) => writeJsonAtomic(settingsFile(storageRoot, dataPath), settings);
23
- export const readAuditSettings = (storageRoot, dataPath) => readValid(AuditSettings, settingsFile(storageRoot, dataPath));
28
+ export const saveAuditSettings = (storageRoot, dataPath, settings) => settingsFile(storageRoot, dataPath).write(settings);
29
+ export const readAuditSettings = (storageRoot, dataPath) => settingsFile(storageRoot, dataPath).read();
24
30
  export class AuditCollector {
25
31
  dataPath;
26
32
  settings;
@@ -33,10 +39,16 @@ export class AuditCollector {
33
39
  this.settings = settings;
34
40
  this.log = new AuditLog(AuditLog.dirFor(storageRoot, dataPath), settings);
35
41
  }
36
- add(e) { this.pending.push({ t: new Date().toISOString(), ...e }); }
42
+ add(e) {
43
+ this.pending.push({ t: new Date().toISOString(), ...e });
44
+ }
37
45
  /** Starts watching the projects' files (when audit.files). */
38
46
  start() {
39
- this.add({ k: 'note', p: 'sandbox started; audit: ' + [this.settings.processes && 'programs', this.settings.files && 'files', 'sessions'].filter(Boolean).join(', ') });
47
+ this.add({
48
+ k: 'note',
49
+ p: 'sandbox started; audit: ' +
50
+ [this.settings.processes && 'programs', this.settings.files && 'files', 'sessions'].filter(Boolean).join(', '),
51
+ });
40
52
  if (!this.settings.files)
41
53
  return;
42
54
  for (const project of this.settings.projects) {
@@ -45,21 +57,32 @@ export class AuditCollector {
45
57
  const rel = file ? String(file) : '';
46
58
  if (!rel || QUIET.test(rel))
47
59
  return;
48
- this.add({ k: 'file', a: event === 'rename' ? 'rename' : 'change', p: rel.replace(/\\/g, '/').slice(0, 1024), w: project });
60
+ this.add({
61
+ k: 'file',
62
+ a: event === 'rename' ? 'rename' : 'change',
63
+ p: rel.replace(/\\/g, '/').slice(0, 1024),
64
+ w: project,
65
+ });
49
66
  }));
50
67
  }
51
- catch { /* a project that is gone */ }
68
+ catch {
69
+ /* a project that is gone */
70
+ }
52
71
  }
53
72
  }
54
73
  /** Programs the sandbox reported: taken in (checked) and deleted. */
55
74
  takeGuestReports() {
56
75
  if (!this.settings.processes)
57
76
  return;
58
- const dir = runPaths(this.dataPath).audit;
77
+ const dir = new RunDir(this.dataPath).auditDir;
59
78
  assertNoLinks(this.dataPath, dir);
60
79
  let names = [];
61
80
  try {
62
- names = fs.readdirSync(dir).filter((n) => /^[\w-]+\.jsonl$/.test(n)).sort().slice(0, MAX_FILES_PER_PASS);
81
+ names = fs
82
+ .readdirSync(dir)
83
+ .filter((n) => /^[\w-]+\.jsonl$/.test(n))
84
+ .sort()
85
+ .slice(0, MAX_FILES_PER_PASS);
63
86
  }
64
87
  catch {
65
88
  return;
@@ -79,7 +102,7 @@ export class AuditCollector {
79
102
  catch {
80
103
  continue;
81
104
  }
82
- const e = AuditEvent.safeParse(raw);
105
+ const e = AuditEventSchema.safeParse(raw);
83
106
  if (e.success)
84
107
  this.pending.push({ ...e.data, k: 'proc', w: undefined, a: undefined });
85
108
  }
@@ -91,27 +114,39 @@ export class AuditCollector {
91
114
  }
92
115
  }
93
116
  trackSessions() {
94
- const now = new Map(listSessions(this.dataPath).map((s) => [s.id, s.phase]));
95
- for (const s of listSessions(this.dataPath)) {
117
+ const now = new Map(new RunDir(this.dataPath).listSessions().map((s) => [s.id, s.phase]));
118
+ for (const s of new RunDir(this.dataPath).listSessions()) {
96
119
  const before = this.sessions.get(s.id);
97
120
  if (!before && s.phase === 'running')
98
121
  this.add({ k: 'session', a: 'start', p: s.harness, w: s.cwd, c: s.id });
99
122
  if (before === 'running' && (s.phase === 'exited' || s.phase === 'failed'))
100
- this.add({ k: 'session', a: 'end', p: s.harness, w: s.cwd, c: s.id + (s.exitCode !== undefined ? ' exit ' + s.exitCode : '') });
123
+ this.add({
124
+ k: 'session',
125
+ a: 'end',
126
+ p: s.harness,
127
+ w: s.cwd,
128
+ c: s.id + (s.exitCode !== undefined ? ' exit ' + s.exitCode : ''),
129
+ });
101
130
  }
102
131
  this.sessions = now;
103
132
  }
104
- guard(detail) { this.add({ k: 'guard', p: detail.slice(0, 1024) }); }
133
+ guard(detail) {
134
+ this.add({ k: 'guard', p: detail.slice(0, 1024) });
135
+ }
105
136
  /** Writes what came in since the last call (repeats folded); call every few seconds. */
106
137
  flush() {
107
138
  try {
108
139
  this.takeGuestReports();
109
140
  }
110
- catch { /* next pass */ }
141
+ catch {
142
+ /* next pass */
143
+ }
111
144
  try {
112
145
  this.trackSessions();
113
146
  }
114
- catch { /* next pass */ }
147
+ catch {
148
+ /* next pass */
149
+ }
115
150
  const events = this.pending.sort((a, b) => a.t.localeCompare(b.t));
116
151
  this.pending = [];
117
152
  this.log.append(fold(events));
@@ -122,5 +157,7 @@ export class AuditCollector {
122
157
  this.flush();
123
158
  this.log.maintain();
124
159
  }
125
- maintain() { this.log.maintain(); }
160
+ maintain() {
161
+ this.log.maintain();
162
+ }
126
163
  }
@@ -1,6 +1,6 @@
1
1
  import { z } from 'zod';
2
2
  /** One event. k: proc (a program started), file (changed in a project), session, guard (repo guard), note. */
3
- export declare const AuditEvent: z.ZodObject<{
3
+ export declare const AuditEventSchema: z.ZodObject<{
4
4
  t: z.ZodString;
5
5
  k: z.ZodEnum<{
6
6
  file: "file";
@@ -16,7 +16,7 @@ export declare const AuditEvent: z.ZodObject<{
16
16
  w: z.ZodOptional<z.ZodString>;
17
17
  n: z.ZodOptional<z.ZodNumber>;
18
18
  }, z.core.$strip>;
19
- export type AuditEvent = z.output<typeof AuditEvent>;
19
+ export type AuditEvent = z.output<typeof AuditEventSchema>;
20
20
  export declare class AuditLog {
21
21
  readonly dir: string;
22
22
  private readonly limits;
@@ -6,7 +6,7 @@ import path from 'node:path';
6
6
  import zlib from 'node:zlib';
7
7
  import { z } from 'zod';
8
8
  /** One event. k: proc (a program started), file (changed in a project), session, guard (repo guard), note. */
9
- export const AuditEvent = z.object({
9
+ export const AuditEventSchema = z.object({
10
10
  /** ISO time. */
11
11
  t: z.string().max(40),
12
12
  k: z.enum(['proc', 'file', 'session', 'guard', 'note']),
@@ -32,8 +32,12 @@ export class AuditLog {
32
32
  this.limits = limits;
33
33
  }
34
34
  /** <storage>\audit\<data set name>. */
35
- static dirFor(storageRoot, dataPath) { return path.join(storageRoot, 'audit', path.basename(dataPath)); }
36
- dayFile(day, gz = false) { return path.join(this.dir, day + '.jsonl' + (gz ? '.gz' : '')); }
35
+ static dirFor(storageRoot, dataPath) {
36
+ return path.join(storageRoot, 'audit', path.basename(dataPath));
37
+ }
38
+ dayFile(day, gz = false) {
39
+ return path.join(this.dir, day + '.jsonl' + (gz ? '.gz' : ''));
40
+ }
37
41
  append(events) {
38
42
  if (!events.length)
39
43
  return;
@@ -61,10 +65,16 @@ export class AuditLog {
61
65
  fs.rmSync(file);
62
66
  }
63
67
  const oldest = new Date(Date.parse(today) - (this.limits.days - 1) * 86400000).toISOString().slice(0, 10);
64
- const files = fs.readdirSync(this.dir).filter((n) => DAY_FILE.test(n)).sort();
68
+ const files = fs
69
+ .readdirSync(this.dir)
70
+ .filter((n) => DAY_FILE.test(n))
71
+ .sort();
65
72
  for (const name of files.filter((n) => DAY_FILE.exec(n)[1] < oldest))
66
73
  fs.rmSync(path.join(this.dir, name), { force: true });
67
- let left = fs.readdirSync(this.dir).filter((n) => DAY_FILE.test(n)).sort();
74
+ let left = fs
75
+ .readdirSync(this.dir)
76
+ .filter((n) => DAY_FILE.test(n))
77
+ .sort();
68
78
  const size = () => left.reduce((sum, n) => sum + fs.statSync(path.join(this.dir, n)).size, 0);
69
79
  while (left.length > 1 && size() > this.limits.maxMb * 1024 * 1024) {
70
80
  fs.rmSync(path.join(this.dir, left[0]), { force: true });
@@ -78,7 +88,10 @@ export class AuditLog {
78
88
  const since = new Date(Date.now() - ((o.days ?? 1) - 1) * 86400000).toISOString().slice(0, 10);
79
89
  const needle = o.grep?.toLowerCase();
80
90
  const events = [];
81
- for (const name of fs.readdirSync(this.dir).filter((n) => DAY_FILE.test(n) && DAY_FILE.exec(n)[1] >= since).sort()) {
91
+ for (const name of fs
92
+ .readdirSync(this.dir)
93
+ .filter((n) => DAY_FILE.test(n) && DAY_FILE.exec(n)[1] >= since)
94
+ .sort()) {
82
95
  const raw = fs.readFileSync(path.join(this.dir, name));
83
96
  const text = name.endsWith('.gz') ? zlib.gunzipSync(raw).toString('utf8') : raw.toString('utf8');
84
97
  for (const line of text.split('\n')) {
@@ -91,7 +104,7 @@ export class AuditLog {
91
104
  catch {
92
105
  continue;
93
106
  }
94
- const e = AuditEvent.safeParse(parsed);
107
+ const e = AuditEventSchema.safeParse(parsed);
95
108
  if (!e.success)
96
109
  continue;
97
110
  if (o.kinds?.length && !o.kinds.includes(e.data.k))
@@ -107,7 +120,10 @@ export class AuditLog {
107
120
  bytes() {
108
121
  if (!fs.existsSync(this.dir))
109
122
  return 0;
110
- return fs.readdirSync(this.dir).filter((n) => DAY_FILE.test(n)).reduce((sum, n) => sum + fs.statSync(path.join(this.dir, n)).size, 0);
123
+ return fs
124
+ .readdirSync(this.dir)
125
+ .filter((n) => DAY_FILE.test(n))
126
+ .reduce((sum, n) => sum + fs.statSync(path.join(this.dir, n)).size, 0);
111
127
  }
112
128
  }
113
129
  /**
@@ -1,6 +1,6 @@
1
1
  import os from 'node:os';
2
- import type { SessionStatus } from '../core/types.js';
3
- import { type Viewers } from '../shared/pty-client.js';
2
+ import type { SessionStatus } from '../../core/types.js';
3
+ import { type Viewers } from '../../shared/pty/index.js';
4
4
  /**
5
5
  * True only for IPv4 addresses inside the subnet of one of this PC's Hyper-V adapters ("vEthernet ..."), which is
6
6
  * where Windows Sandbox lives. Stops a compromised sandbox from pointing the host (and your keystrokes) anywhere else.
@@ -2,10 +2,10 @@
2
2
  // trusted, and everything the sandbox reports is printed through safeText.
3
3
  import net from 'node:net';
4
4
  import os from 'node:os';
5
- import { fail, safeText, sleep } from '../core/util.js';
6
- import { connect, DETACH_KEY, queryViewers, runTerminalClient } from '../shared/pty-client.js';
7
- import { currentSessions } from './channel.js';
8
- import { insideSandbox } from './platform.js';
5
+ import { fail, safeText, sleep } from '../../core/util/index.js';
6
+ import { connect, DETACH_KEY, queryViewers, runTerminalClient, } from '../../shared/pty/index.js';
7
+ import { SandboxChannel } from './channel.js';
8
+ import { insideSandbox } from '../sandbox/index.js';
9
9
  const ipToInt = (ip) => ip.split('.').reduce((n, part) => n * 256 + Number(part), 0);
10
10
  /**
11
11
  * True only for IPv4 addresses inside the subnet of one of this PC's Hyper-V adapters ("vEthernet ..."), which is
@@ -15,17 +15,21 @@ export const isSandboxAddress = (ip, interfaces = os.networkInterfaces()) => {
15
15
  if (!net.isIPv4(ip))
16
16
  return false;
17
17
  // WSL's adapter is a Hyper-V adapter too, but no sandbox lives there: keystrokes must never go to a WSL VM.
18
- return Object.entries(interfaces).some(([name, list]) => /^vEthernet/i.test(name) && !/WSL/i.test(name) && (list ?? []).some((i) => {
19
- if (i.family !== 'IPv4' || i.internal)
20
- return false;
21
- const mask = ipToInt(i.netmask);
22
- return mask !== 0 && (ipToInt(i.address) & mask) === (ipToInt(ip) & mask) && i.address !== ip;
23
- }));
18
+ return Object.entries(interfaces).some(([name, list]) => /^vEthernet/i.test(name) &&
19
+ !/WSL/i.test(name) &&
20
+ (list ?? []).some((i) => {
21
+ if (i.family !== 'IPv4' || i.internal)
22
+ return false;
23
+ const mask = ipToInt(i.netmask);
24
+ return mask !== 0 && (ipToInt(i.address) & mask) === (ipToInt(ip) & mask) && i.address !== ip;
25
+ }));
24
26
  };
25
27
  /** Where this PC may connect for a session: only addresses on its own Hyper-V network (null if there are none). */
26
28
  const hostEndpoint = (session) => {
27
29
  // Inside the sandbox every session is on loopback; on the PC only addresses on its Hyper-V network are trusted.
28
- const addresses = insideSandbox() ? ['127.0.0.1'] : session.attach?.addresses.filter((a) => isSandboxAddress(a)) ?? [];
30
+ const addresses = insideSandbox()
31
+ ? ['127.0.0.1']
32
+ : (session.attach?.addresses.filter((a) => isSandboxAddress(a)) ?? []);
29
33
  return session.attach && addresses.length ? { ...session.attach, addresses } : null;
30
34
  };
31
35
  /** Who is watching a session right now (closed terminals do not count); null when it cannot be asked. */
@@ -38,7 +42,11 @@ export const sessionViewers = (session) => {
38
42
  * sandbox claude -t picks it back up instead of starting another. A session that cannot answer is never reused.
39
43
  */
40
44
  export const findUnwatchedSession = async (dataPath, harness, cwd) => {
41
- const candidates = currentSessions(dataPath).filter((s) => s.harness === harness && s.cwd.toLowerCase() === cwd.toLowerCase()).reverse().slice(0, 8);
45
+ const candidates = new SandboxChannel(dataPath)
46
+ .currentSessions()
47
+ .filter((s) => s.harness === harness && s.cwd.toLowerCase() === cwd.toLowerCase())
48
+ .reverse()
49
+ .slice(0, 8);
42
50
  for (const session of candidates)
43
51
  if ((await sessionViewers(session))?.remote === 0)
44
52
  return session;
@@ -50,9 +58,18 @@ export const attachTerminal = async (session) => {
50
58
  fail('--terminal / attach needs an interactive terminal.', 'Run it directly in Windows Terminal or PowerShell, not through a pipe or script.');
51
59
  if (!session.attach)
52
60
  fail('This session cannot be attached to: networking or attach is disabled for this sandbox.', 'Set sandbox.networking and attach.enabled to true, then start a new sandbox.');
53
- const endpoint = hostEndpoint(session) ?? fail('Refusing to connect: the sandbox reported no address on this PC\'s Hyper-V (vEthernet) network (' + session.attach.addresses.join(', ') + ').', 'Use the sandbox window instead (sbx-show); if this keeps happening, run sandbox doctor.');
61
+ const endpoint = hostEndpoint(session) ??
62
+ fail("Refusing to connect: the sandbox reported no address on this PC's Hyper-V (vEthernet) network (" +
63
+ session.attach.addresses.join(', ') +
64
+ ').', 'Use the sandbox window instead (sbx-show); if this keeps happening, run sandbox doctor.');
54
65
  const socket = await connect(endpoint);
55
- console.log('Attaching to ' + safeText(session.harness) + ' session ' + session.id + ' (' + safeText(session.cwd) + '). Detach any time with Ctrl+]');
66
+ console.log('Attaching to ' +
67
+ safeText(session.harness) +
68
+ ' session ' +
69
+ session.id +
70
+ ' (' +
71
+ safeText(session.cwd) +
72
+ '). Detach any time with Ctrl+]');
56
73
  await sleep(400);
57
74
  const result = await runTerminalClient(socket, session.attach.token, { detachKey: DETACH_KEY });
58
75
  switch (result.reason) {
@@ -62,7 +79,8 @@ export const attachTerminal = async (session) => {
62
79
  case 'exit':
63
80
  console.log(safeText(session.harness) + ' exited with code ' + result.exitCode + '.');
64
81
  return result.exitCode;
65
- case 'error': fail('The sandbox refused the connection: ' + result.message, 'Try sandbox attach again; the session may have restarted.');
82
+ case 'error':
83
+ return fail('The sandbox refused the connection: ' + result.message, 'Try sandbox attach again; the session may have restarted.');
66
84
  default:
67
85
  console.log('Connection to the sandbox closed.');
68
86
  return 1;
@@ -0,0 +1,51 @@
1
+ import type { GuestRequest, GuestResponse, Harness, SandboxStatus, SessionStatus } from '../../core/types.js';
2
+ import type { ProjectSpec } from '../../shared/channel/index.js';
3
+ /** Most sessions the host will ever contact for one listing: a sandbox can write as many session files as it likes. */
4
+ export declare const MAX_QUERIED_SESSIONS = 32;
5
+ /** Where progress lines go: printed by default; a spinner passes its own. Text from the sandbox, made safe first. */
6
+ export type Progress = (line: string) => void;
7
+ /** Sessions in this guest folder or below (one project's) first, each group newest first. */
8
+ export declare function sessionsFirstIn(sessions: SessionStatus[], guestDir: string | null): SessionStatus[];
9
+ /** The channel to the sandbox of one data folder: requests go into its run folder, answers are polled from it. */
10
+ export declare class SandboxChannel {
11
+ private readonly dataPath;
12
+ private readonly isAlive;
13
+ private readonly run;
14
+ constructor(dataPath: string, isAlive?: () => boolean);
15
+ private until;
16
+ /** Deletes an answer once read; a planted link means the answer is read and nothing is deleted. */
17
+ private dropResponse;
18
+ /** Waits until the sandbox finished provisioning, reporting each boot step (onStatus: every status read, validated). */
19
+ waitForReady(launchId: string | null, progress?: Progress, onStatus?: (status: SandboxStatus) => void): Promise<SandboxStatus>;
20
+ send(request: GuestRequest): void;
21
+ waitForResponse(requestId: string, timeoutMs: number): Promise<GuestResponse>;
22
+ /**
23
+ * project: a project registered after boot (provisioned first). harnessSpec: the agent's definition, for an agent the
24
+ * sandbox did not boot with.
25
+ */
26
+ requestSession(harness: string, args: string[], cwd: string, extra?: {
27
+ project?: ProjectSpec;
28
+ harnessSpec?: Harness;
29
+ }): string;
30
+ /**
31
+ * Provisions a registered project without starting an agent and waits for it, printing its progress (the guest's
32
+ * run\projects\<name>.json) as it goes. Throws when it failed.
33
+ */
34
+ prepareProject(project: ProjectSpec, progress?: Progress): Promise<GuestResponse>;
35
+ waitForSession(sessionId: string, timeoutMs?: number, progress?: Progress): Promise<SessionStatus>;
36
+ /** Runs a command inside the sandbox (in the workspace or a folder below it) and returns its output. */
37
+ exec(command: string[], cwd: string, timeoutSeconds: number): Promise<GuestResponse>;
38
+ /** Restarts running sessions in place (they resume via the harness's resumeArguments, e.g. claude --continue). */
39
+ restart(harness: string | null, cwd?: string): Promise<GuestResponse>;
40
+ ping(): Promise<GuestResponse>;
41
+ runningSessions(): SessionStatus[];
42
+ /** Running sessions of the sandbox that is running now (its launch id), newest last, capped. */
43
+ currentSessions(): SessionStatus[];
44
+ /**
45
+ * The session with this id (or id prefix), else the most recently started running one: in `guestDir` (the project
46
+ * you are in) when it has one, else any.
47
+ */
48
+ pickSession(sessionId?: string, guestDir?: string | null): SessionStatus;
49
+ /** Forgets status from a previous sandbox run so nothing stale is picked up. */
50
+ reset(): void;
51
+ }